Python 将多个csv文件读取到HDF5时,解析错误EOF字符

Python 将多个csv文件读取到HDF5时,解析错误EOF字符,python,csv,python-3.x,pandas,hdf5,Python,Csv,Python 3.x,Pandas,Hdf5,使用蟒蛇3,熊猫0.12 我正在尝试将多个csv文件(总大小为7.9 GB)写入HDF5存储,以便以后处理。csv文件每个包含大约一百万行,15列,数据类型主要是字符串,但也有一些浮动。但是,当我尝试读取csv文件时,我遇到以下错误: Traceback (most recent call last): File "filter-1.py", line 38, in <module> to_hdf() File "filter-1.py", line 31, in t

使用蟒蛇3,熊猫0.12

我正在尝试将多个csv文件(总大小为7.9 GB)写入HDF5存储,以便以后处理。csv文件每个包含大约一百万行,15列,数据类型主要是字符串,但也有一些浮动。但是,当我尝试读取csv文件时,我遇到以下错误:

Traceback (most recent call last):
  File "filter-1.py", line 38, in <module>
    to_hdf()
  File "filter-1.py", line 31, in to_hdf
    for chunk in reader:
  File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 578, in __iter__
    yield self.read(self.chunksize)
  File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 608, in read
    ret = self._engine.read(nrows)
  File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 1028, in read
    data = self._reader.read(nrows)
  File "parser.pyx", line 706, in pandas.parser.TextReader.read (pandas\parser.c:6745)
  File "parser.pyx", line 740, in pandas.parser.TextReader._read_low_memory (pandas\parser.c:7146)
  File "parser.pyx", line 781, in pandas.parser.TextReader._read_rows (pandas\parser.c:7568)
  File "parser.pyx", line 768, in pandas.parser.TextReader._tokenize_rows (pandas\parser.c:7451)
  File "parser.pyx", line 1661, in pandas.parser.raise_parser_error (pandas\parser.c:18744)
pandas.parser.CParserError: Error tokenizing data. C error: EOF inside string starting at line 754991
Closing remaining open files: ta_store.h5... done 
编辑

如果我进入引发CParserError EOF的CSV文件。。。并手动删除导致问题的行之后的所有行,csv文件被正确读取。不过,我要删除的都是空行。
奇怪的是,当我手动更正错误的csv文件时,它们会被单独加载到存储中。但是当我再次使用多个文件的列表时,“false”文件仍然会返回错误。

这样做内部循环将允许您检测“bad”文件(并进一步调查)


我也有类似的问题。“EOF inside string”列出的行中有一个字符串,其中包含一个单引号。当我添加quoting=csv.QUOTE_NONE选项时,它解决了我的问题

例如:

import csv
df = pd.read_csv(csvfile, header = None, delimiter="\t", quoting=csv.QUOTE_NONE, encoding='utf-8')

我也有同样的问题,在将这两个参数添加到代码中之后,问题就消失了

读取csv(…
quoting=3
error\u bad\u line=False


对我来说,其他的解决方案不起作用,让我头疼不已。error\u bad\u lines=False仍然给出错误
C错误:从第行开始的字符串中的EOF。使用不同的引号也不能得到预期的结果,因为我不想在我的文本中使用引号

我意识到熊猫0.20中有一只虫子。升级到0.21版完全解决了我的问题。有关此错误的详细信息,请参阅:


注意:这可能与URL中提到的Windows相关。

解决方案是在read\u csv函数中使用参数engine='python'。熊猫CSV解析器可以使用两个不同的“引擎”来解析CSV文件–Python或C(这也是默认值)

在本文中,Python引擎被描述为“速度较慢,但功能更完整”


我意识到这是一个老问题,但我想分享更多关于这个错误的根本原因的细节,以及@Selah的解决方案为什么有效

csv.py
docstring:

    * quoting - controls when quotes should be generated by the writer.
    It can take on any of the following module constants:

    csv.QUOTE_MINIMAL means only when required, for example, when a
        field contains either the quotechar or the delimiter
    csv.QUOTE_ALL means that quotes are always placed around fields.
    csv.QUOTE_NONNUMERIC means that quotes are always placed around
        fields which do not parse as integers or floating point
        numbers.
    csv.QUOTE_NONE means that quotes are never placed around fields.
csv.QUOTE_MINIMAL
是默认值,
是默认值
quotechar
。如果csv文件中的某个地方有一个quotechar,它将被解析为字符串,直到出现另一个quotechar。如果文件有奇数个quotechars,则在到达
EOF
也要注意,QuoTeCARS之间的任何东西都将被解析为一个字符串。即使有很多断线(预期将被解析为单独的行),它们都会进入表的单个字段。因此,您在错误中得到的行号可能是误导性的。
In[4]: import pandas as pd
  ...: from io import StringIO
  ...: test_csv = '''a,b,c
  ...: "d,e,f
  ...: g,h,i
  ...: "m,n,o
  ...: p,q,r
  ...: s,t,u
  ...: '''
  ...: 
In[5]: test = StringIO(test_csv)
In[6]: pd.read_csv(test)
Out[6]: 
                 a  b  c
0  d,e,f\ng,h,i\nm  n  o
1                p  q  r
2                s  t  u
In[7]: test_csv_2 = '''a,b,c
  ...: "d,e,f
  ...: g,h,i
  ...: "m,n,o
  ...: "p,q,r
  ...: s,t,u
  ...: '''
  ...: test_2 = StringIO(test_csv_2)
  ...: 
In[8]: pd.read_csv(test_2)
Traceback (most recent call last):
...
...
pandas.errors.ParserError: Error tokenizing data. C error: EOF inside string starting at line 2

第一个字符串有2个(偶数)quotechars。因此每个quotechar都是关闭的,csv解析时没有错误,尽管可能不是我们所期望的。另一个字符串有3个(奇数)quotechars。最后一个quotechar未关闭,并且达到EOF,因此出现错误。但我们在错误消息中得到的第2行具有误导性。我们预期为4行,但由于第一个quotechar和第二个quotechar之间的所有内容都被解析为字符串,因此我们的
”p、 q,r
行实际上是第二行。

在查找了几个小时的解决方案后,我终于想出了一个解决方法

在不降低多处理效率的情况下,消除此
C错误的最佳方法是预处理输入数据(如果有机会的话)

替换输入文件中的所有“\n”项,例如“,”或任何其他唯一符号序列(例如“aghr21*&”)。然后您将能够将数据读入数据框


读取数据后,可能需要将所有唯一符号序列(“aghr21*&”)替换回“\n”。

在尝试从Github存储库中提取数据时遇到类似问题。简单的错误是,尝试从git blob(html呈现部分)而不是原始csv中提取数据


如果您正在从git repo中提取数据,请确保您的链接不包含“/blob”,除非您对来自repo的html代码特别感兴趣,否则不要传递
mode='w'
;您在每次迭代时都会截断hdf文件。您可以尝试捕获CParserror,只需跳过该文件(直到修复它)嗨,Jeff,你建议我如何捕获CParserError。检查每个单独的文件太麻烦了。首先找出它是哪个文件,不要检查,只需捕获:
from pandas.io import parser;尝试:读取csv查找文件f,除了(parser.CParserError)as detail:print f,detail
很抱歉,我不太了解您的代码-我对python/pandas比较陌生。请您进一步解释一下好吗?嗨,杰夫,谢谢!它很有效,我确实找到了导致问题的文件/行。现在我可以尝试手动“更正”这些文件,但我希望有一个更具编程性的解决方案。因此,我需要了解我返回的错误实际上是什么,以及我应该编写什么类型的代码来自动处理该问题。您可以尝试指定一个
行终止符
(在linux上基本上是
\n
(或者我认为在windows上是
\n\r
),最糟糕的是,您会得到一行错误的代码(当无效终止符放入下一行时)…但首先需要看看哪里出了问题:奇怪的是,当我手动更正错误的csv文件时,它们会被单独加载到存储中。但是当我再次使用
glob
读取大量文件时,这些文件仍然会返回错误。这对于
glob
,我感到奇怪
pandas.read_csv(filepath, sep=',', delimiter=None, 
            header='infer', names=None, 
            index_col=None, usecols=None, squeeze=False, 
            ..., engine=None, ...)
engine : {‘c’, ‘python’}
    * quoting - controls when quotes should be generated by the writer.
    It can take on any of the following module constants:

    csv.QUOTE_MINIMAL means only when required, for example, when a
        field contains either the quotechar or the delimiter
    csv.QUOTE_ALL means that quotes are always placed around fields.
    csv.QUOTE_NONNUMERIC means that quotes are always placed around
        fields which do not parse as integers or floating point
        numbers.
    csv.QUOTE_NONE means that quotes are never placed around fields.
In[4]: import pandas as pd
  ...: from io import StringIO
  ...: test_csv = '''a,b,c
  ...: "d,e,f
  ...: g,h,i
  ...: "m,n,o
  ...: p,q,r
  ...: s,t,u
  ...: '''
  ...: 
In[5]: test = StringIO(test_csv)
In[6]: pd.read_csv(test)
Out[6]: 
                 a  b  c
0  d,e,f\ng,h,i\nm  n  o
1                p  q  r
2                s  t  u
In[7]: test_csv_2 = '''a,b,c
  ...: "d,e,f
  ...: g,h,i
  ...: "m,n,o
  ...: "p,q,r
  ...: s,t,u
  ...: '''
  ...: test_2 = StringIO(test_csv_2)
  ...: 
In[8]: pd.read_csv(test_2)
Traceback (most recent call last):
...
...
pandas.errors.ParserError: Error tokenizing data. C error: EOF inside string starting at line 2