2013-08-02 157 views
13

使用Python3時,熊貓0.12熊貓ParserError EOF字符讀取多個CSV文件HDF5

我想寫多個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=Falsepd.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文件時,它們會單獨加載到商店中。但是當我再次使用多個文件的列表時,「錯誤」文件仍然會返回錯誤。

+0

不通過''mode ='w''';你在每次迭代中截斷hdf文件 – Jeff

+0

你可以嘗試捕獲CParserError並跳過該文件(直到你修復它) – Jeff

+0

嗨,傑夫,你如何建議我抓住CParserError。檢查每個單獨的文件太麻煩了。 – Matthijs

回答

5

讓你的內環這樣可以讓你檢測「壞」的文件(及進一步調查)

from pandas.io import parser 

def to_hdf(): 

    ..... 

    # Reading csv files from list_files function 
    for f in list_files(): 
     # Creating reader in chunks -- reduces memory load 

     try: 

      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', table=True) 

     except (parser.CParserError) as detail: 
      print f, detail 
+0

嗨,傑夫,謝謝!它的工作原理和我確實發現了哪些文件/行導致了這個問題。現在我可以嘗試手動「糾正」這些文件,但我寧願有一個更加程序化的解決方案。因此,我需要了解實際上返回的錯誤以及我編寫的代碼是否會自動處理該問題。 – Matthijs

+0

你可以嘗試指定一個''lineterminator''(它本質上是''\ n''在Linux上(或者我認爲在windows上是''n \ r'')。無效的終止符放在下一行).....但需要首先看看有什麼問題:http://pandas.pydata.org/pandas-docs/dev/io.html#csv-text-files – Jeff

+0

奇怪的是,當我手動更正錯誤的csv文件時,它們被單獨加載到商店中,但是當我再次使用'glob'讀取一堆文件時,這些文件仍然會返回錯誤信息 – Matthijs

38

我也有類似的問題。用「EOF內部字符串」列出的行中有一個字符串,其中包含一個單引號。當我添加選項quoting = csv.QUOTE_NONE它解決了我的問題。

例如:

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

這是一個最佳解決方案 – DACW

+2

我還加入了'import csv' – user1700890

4

我有同樣的問題,並添加這些兩個參數來我的代碼後,問題就消失了。

read_csv (... quoting=3 , error_bad_lines=False)

+0

這個作品很有魅力。一行中有錯誤。在執行上面的選項後,我收到了以下消息:「跳過192行:預計5個字段,看到74」 –

0

對我來說,其他的解決方案並沒有工作,讓我很頭疼。 error_bad_lines = False仍然給出錯誤C error: EOF inside string starting at line。使用不同的引用也沒有給出預期的結果,因爲我不想在我的文本中引用引號。

我意識到Pandas 0.20中存在一個bug。升級到版本0.21完全解決了我的問題。有關此錯誤的更多信息,請參閱:https://github.com/pandas-dev/pandas/issues/16559

注意:這可能與URL中提到的Windows相關。

+0

這不起作用 - 即使升級到pandas-0.22.0後,我也收到了同樣的錯誤 –

1

解決方法是在read_csv函數中使用參數engine ='python'。 Pandas CSV解析器可以使用兩個不同的「引擎」來解析CSV文件 - Python或C(這也是默認設置)。

pandas.read_csv(filepath, sep=',', delimiter=None, 
      header='infer', names=None, 
      index_col=None, usecols=None, squeeze=False, 
      ..., engine=None, ...) 

Python的發動機被描述爲「慢,但更完整特性」在Pandas documentation

engine : {‘c’, ‘python’}