Python 读取带有垃圾值的错误csv文件
我希望使用pandas读取具有以下格式的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
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。没问题。我很乐意看一看。谢谢收听。