Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 读取带有垃圾值的错误csv文件_Python_Pandas_Csv_Tokenize_Parse Error - Fatal编程技术网

Python 读取带有垃圾值的错误csv文件

Python 读取带有垃圾值的错误csv文件,python,pandas,csv,tokenize,parse-error,Python,Pandas,Csv,Tokenize,Parse Error,我希望使用pandas读取具有以下格式的csv文件: atrrth sfkjbgksjg airuqghlerig Name Roll airuqgorqowi awlrkgjabgwl AAA 67 BBB 55 CCC 07 如您所见,如果我使用pd.read\u csv,我会得到相当明显的错误: ParserError: Error tokeni

我希望使用pandas读取具有以下格式的csv文件:

    atrrth
    sfkjbgksjg
    airuqghlerig
    Name         Roll
    airuqgorqowi
    awlrkgjabgwl
    AAA          67
    BBB          55
    CCC          07
如您所见,如果我使用
pd.read\u csv
,我会得到相当明显的错误:

 ParserError: Error tokenizing data. C error: Expected 1 fields in line 4, saw 2
但我希望将整个数据放到一个数据帧中。使用
error\u bad\u lines=False将删除重要内容,只留下垃圾值

以下是两个可能的列名:

Name : [Name , NAME , Name of student] 
Roll : [Rollno , Roll , ROLL]

如何实现这一点?

打开csv文件,找到列名起始的行:

with open(r'data.csv') as fp:
    skip = next(filter(
        lambda x: x[1].startswith(('Name','NAME')),
        enumerate(fp)
    ))[0]
该值将存储在
skip
参数中

import pandas as pd
df = pd.read_csv('data.csv', skiprows=skip)

在Python3.X中工作

如果确实是这样的结构(而不仅仅是一个可以得到哪种垃圾的示例),您可以简单地使用参数指示应该跳过多少行。换句话说,您应该像这样读取数据帧:

import pandas as pd

df = pd.read_csv('your.csv', skiprows=3)
def isheader(line):
    items = line.strip().split()
    if len(items) != 2:
        return False
    items = sorted(map(str.casefold, items))
    return items[0].startswith('name') and items[1].startswith('roll')

请注意,
skiprows
可以做得更多。检查文档。

我想建议对文档进行轻微修改/简化。您可以继续将相同的流直接加载到pandas中,而不是关闭并重新打开文件。您可以记录标题行并手动拆分以提供列名,而不是记录要跳过的行数:

with open(r'data.csv') as fp:
    names = next(line for line in fp if line.casefold().lstrip().startswith('name'))
    df = pd.read_csv(fp, names=names.strip().split())
这对于包含大量垃圾桶的文件具有优势

更详细的检查可以是这样的:

import pandas as pd

df = pd.read_csv('your.csv', skiprows=3)
def isheader(line):
    items = line.strip().split()
    if len(items) != 2:
        return False
    items = sorted(map(str.casefold, items))
    return items[0].startswith('name') and items[1].startswith('roll')
此函数将以任何顺序处理您的所有可能性,但当前也会跳过包含空格的垃圾桶行。您可以将其用作过滤器:

names = next(line for line in fp if isheader(line))

数据位于csv文件中。我怎样才能把它全部放进字符串“s”中呢。这里我只举了一个例子。我的数据实际上很大,我无法手动创建“s”,我希望对此进行概括。一开始的垃圾值可能是3行,或者10行。有没有一种方法可以获取所有数据,而不管它是“好”还是“坏”?数据框可以在以后操作这将起作用…如果这对你有效,请投票并接受对不起,请给出你的答案,但是鉴于新的编辑,你能告诉我新代码应该是什么样子吗?我对文件的阅读不是很流利…很抱歉,你的列名是否保持不变,或者它们也会随着.csv文件而改变?不,不是。这些栏目有一个可能的名字列表。你可以编辑你的问题,并给出这些栏目的名字列表[[姓名:姓名,姓名,学生姓名],[滚动:滚动,滚动]]我会编辑这个问题。这似乎是一个很好的答案。但是我的数据集可以包含任意数量的列。你能试着看看这个新问题吗??@Siddharth。一旦你得到了好的答案,你真的不应该改变你问题中的要求,更不用说接受了。改为问一个新问题,如果回答者感兴趣,通知他们。所以不是一个帮助论坛。这是一个问答网站,未来的读者可以在这里找到类似问题的答案。我理解。这里有点绝望,所以开始疯狂编辑。无论如何,这里有一个新的问题:我希望你能考虑一下这个新的问题,不受进一步的改变。@ Siddharth。没问题。我很乐意看一看。谢谢收听。