很多问题已经被问到了about this topic on SO.(还有很多其他的)。在众多的答案中,到目前为止没有一个对我有真正的帮助。如果我错过了有用的,请告诉我。
我只是想把一个有Pandas的CSV文件读入数据框。听起来像是一个简单的任务。
我的文件Test.csv
1,2,3,4,5
1,2,3,4,5,6
,,3,4,5
1,2,3,4,5,6,7
,2,,4
我的代码:
import pandas as pd
df = pd.read_csv('Test.csv',header=None)
我的错误:
pandas.errors.ParserError: Error tokenizing data. C error: Expected 5 fields in line 2, saw 6
我猜这个问题是Pandas查看第一行,并期望在后面的行中有相同数量的令牌,如果不是这样,它将停止并返回错误。
在众多答案中,使用选项的建议如下:error_bad_lines=False
或header=None
或skiprows=3
以及更多无用的建议。
但是,我不想忽略任何一行或跳过。而且我事先不知道数据文件有多少列和多少行。
因此,它基本上归结为如何找到数据文件中的最大列数。这是要走的路吗?我希望有一个简单的方法来读取CSV文件,它在第一行没有最大列数。谢谢你的提示。我使用的是Python 3.6.3,Win7上的Pandas 0.24.1。
6条答案
按热度按时间w1e3prcc1#
我有一个不同的解决方案。让Pandas负责创建表和删除None值,让我们负责编写一个适当的标记器。
标记器
令牌化程序的测试用例
产出
['1', '2', '3', '4', '5'] ['', '', '3', '"Hello, World!"', '5', '6'] ['', '', '3', '"Hello,,,, World!"', '5', '6'] ['', '', '3', '"Hello, World!"', '5', '6', '', '3', '"Hello, World!"', '5', '6'] ['', '', '3', '"Hello, World!"', '5', '6', '', '3', '"Hello', '', '5', '6']
将标记化器投入使用
优点:
现在,我们可以根据需要调用标记器函数
mf98qq942#
在我的案例中1我在Excel中打开了 *. csv 2我将 *. csv保存为CSV(逗号分隔)3我通过以下方式在python中加载了该文件:
希望能有所帮助!
koaltpgm3#
对我来说,通过在www.example.com _csv()命令中添加usecols可以解决这个问题pd.read:
使用类别=[“我的列_1”,“我的列_2”,...]
ycggw6v24#
对我来说,解决方案是添加正确的分隔符
;
,如下所示:pandas.read_csv(path, sep=';')
pod7payv5#
感谢@ ALOLZ提供的“非常新鲜”的链接(幸运的巧合)和@Rich Andrews指出我的示例实际上并不是“严格正确的”CSV数据。
因此,我目前使用的工作方式改编自@ ALOLZ紧凑型解决方案(https://stackoverflow.com/a/55129746/7295599)
df
包含空字符串''
,用于开头和中间的缺失条目,以及None
,用于结尾的缺失令牌。如果您通过以下方式将其再次写入文件:
df.to_csv("Test.tab",sep="\t",header=False,index=False)
None
将被转换为空字符串''
,一切正常。下一个层次是考虑引号中包含分隔符的数据字符串,但这是另一个主题。
7qhs6swi6#
使用宽容的python csv模块读取csv,并在将其提交给panda之前修复加载的文件,无论panda使用何种csv引擎,都会在格式错误的csv数据上失败。
在python外部预处理文件,如果担心python内部的额外代码会创建过多的python代码。