将多个 csv 文件读取到 HDF5 时,Pandas ParserError EOF 字符

新手上路,请多包涵

使用 Python3,熊猫 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

编辑

我设法找到了一个产生这个问题的文件。我认为它正在读取 EOF 字符。但是我不知道如何克服这个问题。考虑到组合文件的大小,我认为检查每个字符串中的每个字符太麻烦了。 (即便如此,我仍然不确定该怎么做。)据我检查,csv 文件中没有可能引发错误的奇怪字符。我还尝试将 error_bad_lines=False 传递给 pd.read_csv() ,但错误仍然存在。

我的代码如下:

 # -*- coding: utf-8 -*-

import pandas as pd
import os
from glob import glob

def list_files(path=os.getcwd()):
    ''' List all files in specified path '''
    list_of_files = [f for f in glob('2013-06*.csv')]
    return list_of_files

def to_hdf():
    """ Function that reads multiple csv files to HDF5 Store """
    # Defining path name
    path = 'ta_store.h5'
    # If path exists delete it such that a new instance can be created
    if os.path.exists(path):
        os.remove(path)
    # Creating HDF5 Store
    store = pd.HDFStore(path)

    # Reading csv files from list_files function
    for f in list_files():
        # Creating reader in chunks -- reduces memory load
        reader = pd.read_csv(f, chunksize=50000)
        # Looping over chunks and storing them in store file, node name 'ta_data'
        for chunk in reader:
            chunk.to_hdf(store, 'ta_data', mode='w', table=True)

    # Return store
    return store.select('ta_data')
    return 'Finished reading to HDF5 Store, continuing processing data.'

to_hdf()

编辑

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

原文由 Matthijs 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 423
1 个回答

我有一个类似的问题。列有“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')

原文由 Selah 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题