Python Pandas错误标记数据

我试图使用pandas来操纵.csv文件,但我得到这个错误:

pandas.parser.CParserError: Error tokenizing data. C error: Expected 2 fields in line 3, saw 12 

我试图读pandas文档,但什么都没发现。

我的代码很简单:

 path = 'GOOG Key Ratios.csv' #print(open(path).read()) data = pd.read_csv(path) 

我该如何解决这个问题? 我应该使用csv模块还是其他语言?

谢谢你们

文件来自晨星

你也可以尝试;

 data = pd.read_csv('file1.csv', error_bad_lines=False) 

这可能是一个问题

  • 数据中的分隔符
  • 第一行,@TomAugspurger刻意指出

要解决这个问题,请在调用read_csv时指定sep和/或header参数。 例如,

 df = pandas.read_csv(fileName, sep='delimiter', header=None) 

在上面的代码中, sep定义了你的分隔符和header=None告诉大pandas你的源数据没有行标题/列标题。 因此,文档说:“如果文件不包含标题行,那么你应该明确地传递标题=无”。 在这种情况下,pandas自动为每个字段{0,1,2,…}创build整数字符。

根据文档,定界符的东西不应该是一个问题。 文档说“如果sep是None [未指定],将尝试自动确定这一点。” 然而我没有得到好运,包括带有明显分隔符的例子。 但是,定义sep并不是很困难。

parsing器被文件头弄糊涂了。 它读取第一行并推断该行的列数。 但前两行不代表文件中的实际数据。

尝试使用data = pd.read_csv(path, skiprows=2)

我也有这个问题,但可能是由于不同的原因。 我的CSV中有一些尾随的逗号,里面增加了pandas试图读取的一列。 使用下面的工作,但它只是忽略了坏行:

 data = pd.read_csv('file1.csv', error_bad_lines=False) 

如果你想保持行的丑恶types的处理错误是做类似下面的事情:

 line = [] expected = [] saw = [] cont = True while cont == True: try: data = pd.read_csv('file1.csv',skiprows=line) cont = False except Exception as e: errortype = e.message.split('.')[0].strip() if errortype == 'Error tokenizing data': cerror = e.message.split(':')[1].strip().replace(',','') nums = [n for n in cerror.split(' ') if str.isdigit(n)] expected.append(int(nums[0])) saw.append(int(nums[2])) line.append(int(nums[1])-1) else: cerror = 'Unknown' print 'Unknown Error - 222' if line != []: # Handle the errors however you want 

我开始编写一个脚本来将行重新插入到DataFrame中,因为坏行将由上面代码中的variables“line”给出。 这可以通过简单地使用csv阅读器来避免。 希望pandas开发者能够更轻松地处理这种情况。

这绝对是分隔符的问题,因为大多数csv CSV都是使用sep='/t'创buildsep='/t'所以使用分隔符/t使用制表符(\t)尝试read_csv 。 所以,试着用下面的代码行打开。

 data=pd.read_csv("File_path", sep='\t') 

我遇到了同样的问题。 在同一个源文件上使用pd.read_table()似乎工作。 我无法追查这个原因,但对我的情况来说这是一个有用的解决方法。 也许更有知识的人可以更多地了解为什么它的工作。

编辑:我发现,当你的文件中有一些与实际数据没有相同格式的文本时,这个错误就会出现。 这通常是页眉或页脚信息(大于一行,所以skip_header不起作用),它们不会被实际数据逗号分隔(当使用read_csv时)。 使用read_table使用制表符作为分隔符,可以绕过用户当前的错误,但引入其他错误。

我通常通过将额外的数据读入文件来解决这个问题,然后使用read_csv()方法。

确切的解决scheme可能会有所不同,具体取决于您的实际文件,但是这种方法在几种情况下适用于我

您的CSV文件可能具有可变数量的列,并且read_csv几行推断出列数。 在这种情况下解决它的两种方法:

1)将CSV文件更改为具有最大列数的虚拟第一行(并指定header=[0]

2)或者使用names = list(range(0,N)) ,其中N是最大列数。

我自己有几次这个问题。 几乎每一次,原因是我试图打开的文件不是一个正确保存的CSV开始。 而“恰当地”,我的意思是每行有相同数量的分隔符或列。

通常情况下,这是因为我在Excel中打开了CSV然后不正确地保存了它。 即使文件扩展名仍然是.csv,纯CSV格式已被更改。

用pandasto_csv保存的任何文件都将被正确格式化,不应该有这个问题。 但是如果你用另一个程序打开它,它可能会改变结构。

希望有所帮助。

虽然不是这个问题的情况下,这个错误也可能出现在压缩数据。 显式设置kwarg compression的值解决了我的问题。

 result = pandas.read_csv(data_source, compression='gzip') 

在尝试使用空格,逗号和引号读取制表符分隔的表格时,我遇到了类似的问题:

 1115794 4218 "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", "" 1144102 3180 "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", "g__Bacillus", "" 368444 2328 "k__Bacteria", "p__Bacteroidetes", "c__Bacteroidia", "o__Bacteroidales", "f__Bacteroidaceae", "g__Bacteroides", "" import pandas as pd # Same error for read_table counts = pd.read_csv(path_counts, sep='\t', index_col=2, header=None, engine = 'c') pandas.io.common.CParserError: Error tokenizing data. C error: out of memory 

这说明它与C语法分析引擎(这是默认的)有关。 也许改成一个python会改变任何东西

 counts = pd.read_table(path_counts, sep='\t', index_col=2, header=None, engine='python') Segmentation fault (core dumped) 

现在这是一个不同的错误。
如果我们继续尝试从表格中删除空格,那么python引擎的错误会再次发生变化:

 1115794 4218 "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae","" 1144102 3180 "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae","g__Bacillus","" 368444 2328 "k__Bacteria","p__Bacteroidetes","c__Bacteroidia","o__Bacteroidales","f__Bacteroidaceae","g__Bacteroides","" _csv.Error: ' ' expected after '"' 

而且很明显,pandas在parsing我们的行时遇到了问题。 要用python引擎parsing表,我需要事先从表中删除所有的空格和引号。 与此同时,即使用逗号排列,C语言引擎也不停地崩溃。

为了避免创build一个replace的新文件,我做了这个,因为我的表很小:

 from io import StringIO with open(path_counts) as f: input = StringIO(f.read().replace('", ""', '').replace('"', '').replace(', ', ',').replace('\0','')) counts = pd.read_table(input, sep='\t', index_col=2, header=None, engine='python') 

TL;博士
更改parsing引擎,尽量避免数据中的任何非定界的引号/逗号/空格。

我有一个数据集,预先存在的行号,我用index_col:

 pd.read_csv('train.csv', index_col=0) 

试试: pandas.read_csv(path, sep = ',' ,header=None)

有时候问题不在于如何使用python,而是使用原始数据。
我得到了这个错误信息

 Error tokenizing data. C error: Expected 18 fields in line 72, saw 19. 

原来,在栏目描述中有时候会有逗号。 这意味着需要清理CSV文件或使用其他分隔符。