我正在尝试使用pandas来操作.csv文件,但是我收到此错误:
pandas.parser.CParserError:标记数据时出错 . C错误:第3行预计有2个字段,见12
我曾尝试阅读大熊猫文档,但一无所获 .
我的代码很简单:
path = 'GOOG Key Ratios.csv'
#print(open(path).read())
data = pd.read_csv(path)
我该如何解决这个问题?我应该使用 csv
模块还是其他语言?
档案来自Morningstar
24 回答
我遇到了同样的问题 . 在同一源文件上使用
pd.read_table()
似乎有效 . 我无法追查其原因,但这对我的案例来说是一个有用的解决方法 . 或许知识渊博的人可以更清楚地了解其工作原理 .编辑:我发现当您的文件中有一些文本与实际数据格式不同时,此错误会逐渐显现 . 这通常是页眉或页脚信息(大于一行,因此skip_header不起作用),它们不会被与实际数据相同数量的逗号分隔(使用read_csv时) . 使用read_table使用选项卡作为分隔符,可以绕过用户当前错误但引入其他错误 .
我通常通过将额外数据读入文件然后使用read_csv()方法来解决这个问题 .
确切的解决方案可能会因您的实际文件而异,但在某些情况下,这种方法对我有用
你也可以尝试;
这可能是一个问题
数据中的分隔符
第一行,正如@TomAugspurger所说
要解决此问题,请在调用
read_csv
时尝试指定sep
和/或header
参数 . 例如,在上面的代码中,
sep
定义了分隔符,header=None
告诉pandas您的源数据没有 Headers /列 Headers 的行 . 如此说来the docs:"If file contains no header row, then you should explicitly pass header=None" . 在这种情况下,pandas会自动为每个字段{0,1,2,...}创建整数索引 .根据文档,分隔符应该不是问题 . 文档说"if sep is None [not specified], will try to automatically determine this."但是我没有好运,包括具有明显分隔符的实例 .
解析器被文件的 Headers 弄糊涂了 . 它读取第一行并推断该行的列数 . 但前两行不代表文件中的实际数据 .
试试
data = pd.read_csv(path, skiprows=2)
您的CSV文件可能具有可变数量的列,并且
read_csv
推断出前几行中的列数 . 在这种情况下解决它的两种方法:1)将CSV文件更改为具有最大列数的虚拟第一行(并指定
header=[0]
)2)或使用
names = list(range(0,N))
,其中N是最大列数 .我也有这个问题,但也许是出于其他原因 . 我的CSV中有一些尾随逗号,它们添加了一个pandas试图阅读的附加列 . 使用以下工作,但它只是忽略坏线:
如果你想保持线条是一种丑陋的黑客来处理错误,那就是做如下的事情:
我继续编写一个脚本来将行重新插入到DataFrame中,因为坏行将由上面代码中的变量“line”给出 . 只需使用csv阅读器即可避免这一切 . 希望大熊猫开发人员能够在将来更轻松地处理这种情况 .
这绝对是分隔符的问题,因为大多数csv CSV都是使用
sep='/t'
创建的,所以尝试使用制表符(\t)
使用分隔符/t
read_csv
. 所以,尝试使用以下代码行打开 .我自己有几次这个问题 . 几乎每次,原因是我试图打开的文件不是一个正确保存的CSV开头 . 并且通过“正确”,我的意思是每行具有相同数量的分隔符或列 .
通常它发生是因为我在Excel中打开了CSV然后不正确地保存了它 . 即使文件扩展名仍为.csv,纯CSV格式也已更改 .
使用pandas to_csv保存的任何文件都将正确格式化,不应该出现此问题 . 但是如果你用另一个程序打开它,它可能会改变结构 .
希望有所帮助 .
在尝试使用空格,逗号和引号读取制表符分隔的表时,我遇到了类似的问题:
这说明它与C解析引擎有关(这是默认的) . 也许改成蟒蛇会改变任何东西
现在这是一个不同的错误 .
如果我们继续尝试从表中删除空格,python-engine的错误将再次更改:
很明显,大熊猫在解析我们的行时遇到了问题 . 要使用python引擎解析表,我需要事先从表中删除所有空格和引号 . 与此同时,C-engine即使用逗号连续排列也不停地崩溃 .
为了避免使用替换创建新文件,我这样做了,因为我的表很小:
tl;dr
更改解析引擎,尽量避免任何非分隔数据中的引号/逗号/空格 .
虽然不是这个问题的情况,但压缩数据也可能出现此错误 . 明确设置
kwarg
compression
的值解决了我的问题 .以下命令序列工作(我丢失数据的第一行-no header = None present-,但至少它加载):
df = pd.read_csv(filename, usecols=range(0, 42)) df.columns = ['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14']
以下不起作用:
df = pd.read_csv(filename, names=['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14'], usecols=range(0, 42))
CParserError:标记数据时出错 . C错误:预计行1605634中的53个字段,看到54以下不起作用:
df = pd.read_csv(filename, header=None)
CParserError:标记数据时出错 . C错误:预计行1605634中的53个字段,见54
因此,在您的问题中,您必须通过
usecols=range(0, 2)
有时候问题不是如何使用python,而是使用原始数据 .
我收到此错误消息
事实证明,在列描述中有时候会有逗号 . 这意味着需要清理CSV文件或使用其他分隔符 .
使用
pandas.read_csv('CSVFILENAME',header=None,sep=', ')
当试图从链接读取csv数据时
http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data
我将网站上的数据复制到我的csvfile中 . 它有额外的空间所以使用sep =','它工作:)
我发现在处理类似的解析错误时有用的替代方法是使用CSV模块将数据重新路由到pandas df中 . 例如:
我发现CSV模块对格式不佳的逗号分隔文件更加健壮,因此这条路线成功解决了这些问题 .
我有一个包含现有行号的数据集,我使用了index_col:
这就是我所做的 .
sep='::'
解决了我的问题:我有类似的情况和设置
工作
在参数中使用分隔符
它会读 .
read_csv时遇到同样的问题:ParserError:错误标记数据 . 我刚刚将旧的csv文件保存到新的csv文件中 . 问题已经解决了!
我有一个类似的错误,问题是我的csv文件中有一些转义引号,需要适当设置escapechar参数 .
您可以执行此步骤以避免此问题 -
只需添加 -
header=None
希望这可以帮助!!
问题可能是文件问题,在我的情况下,问题在重命名文件后得到解决 . 还没弄清楚原因..
我收到了一位同事的.csv,当我尝试使用pd.read_csv()读取csv时,我收到了类似的错误 . 它显然试图使用第一行为数据帧生成列,但是有许多行包含的列比第一行所暗示的要多 . 我最后通过打开并将文件重新保存为.csv并再次使用pd.read_csv()来解决此问题 .
试试:
pandas.read_csv(path, sep = ',' ,header=None)