2016-12-16 76 views
1

看上去herehere这些接近我相信我看到的核心问题,但以其他方式得到修复。大熊猫read_csv()与sep和quotechar冲突导致意外的列数

我想解析一个CSV,它有一个现在需要有逗号的字段,需要我们用引号包住这个字段。这是引号中唯一的字段。

我们的分隔符(sep)是逗号,现在我们正在添加引号(quotechar)的字符串分隔符。

我把它煮成这个。在我看来,sep和quotechar应用程序的顺序是导致使用quotechar的行的关键问题,在它们中使用sep将无法工作。

带有最后一行注释的数据文件。

$ cat simple.csv 
column1,column2, column3 
one, two,    three 
one, two,    "three" 
#one, "two, two_again", three 
$ 

代码:

df = pd.read_csv(simple_file, sep=',', header=0, comment='#', quotechar='"') 
print df 

输出:

column1 column2     column3 
0  one  two     three 
1  one  two     "three" 

现在,添加它具有引用字符串中的字符九月的最后一行。

数据文件:

$ cat simple.csv 
column1,column2, column3 
one, two,    three 
one, two,    "three" 
one, "two, two_again", three 
$ 

输出失败:

pandas/parser.pyx in pandas.parser.raise_parser_error (pandas/parser.c:22649)() 
CParserError: Error tokenizing data. C error: Expected 3 fields in line 4, saw 4 

我相信,我想迫使大熊猫首先使用在每一行的报价分隔符,然后使用分隔符,因为它是做相反。似乎无法弄清楚如何。有没有办法告诉熊猫这是我找不到的?

+0

摆脱空间或定义的空间作为分隔符的一部分。然后,只需指定header = None就可以读取文件,其余的默认值将被处理。 – pvg

回答

0

熊猫CSV阅读器会因为您告诉它分隔符严格为'''而感到困惑,但您也将空格用作数据文件中的分隔符。请更改分隔符或修复数据。随着数据

column1,column2, column3 
one,two,three 
one,two,"three" 
one,"two, two_again",three 

您会收到以下

import pandas as pd 
print(pd.read_csv("data.csv", header=None)) 

     0    1   2 
0 column1   column2 column3 
1  one    two  three 
2  one    two  three 
3  one two, two_again  three 
+0

当我创建这个小测试数据文件时,它看起来更糟糕。我认为熊猫足够聪明,可以忽略分隔符周围的空白区域,但我刚刚告诉它分隔符是什么。此时此刻,我的指尖上没有原始文件,但是使用我的测试用例消除了空间后,它可以按照我的预期工作。 –

+0

我无法编辑我自己的评论。我不能编辑自己对自己的问题的评论? –

+0

@KevinM熊猫足够聪明,可以完全按照你所说的去做。如果分隔符只是逗号,则逗号后的空格是下一项的一部分。那么突然间,你在项目中间有一个报价,这是没有意义的,然后是一个额外的分隔符。解析器,明智地,酒吧。你可以很容易地给大熊猫一个正则表达式作为分隔符,尽管这意味着它将使用python而不是C语法分析器 - 这个速度较慢但可能与你的情况无关。 – pvg