Символ Pandas ParserError EOF при чтении нескольких CSV-файлов на HDF5

Использование Python3, Pandas 0.12

Я пытаюсь записать несколько файлов csv (общий размер 7,9 ГБ) в хранилище 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() 

редактировать

Если я войду в CSV-файл, который вызывает CParserError EOF … и вручную удалит все строки после строки, вызывающей проблему, файл csv читается правильно. Однако все, что я удаляю, это пустые строки. Странно то, что когда я вручную исправляю ошибочные файлы csv, они загружаются в магазин в отдельности. Но когда я снова использую список из нескольких файлов, «ложные» файлы по-прежнему возвращают мне ошибки.

  • Backporting Python 3 open (encoding = "utf-8") на Python 2
  • Проверьте код возврата команды, когда подпроцесс вызывает исключение CalledProcessError
  • Совместимость с IronPython 3
  • Командная строка не может написать письмо по букве?
  • Как установить кодировку sys.stdout в Python 3?
  • Использование нескольких версий Python
  • Tor Stem - В Россию с любовью
  • Вычтите значение из каждого числа в списке в Python?
  • 3 Solutions collect form web for “Символ Pandas ParserError EOF при чтении нескольких CSV-файлов на HDF5”

    У меня была аналогичная проблема. Строка, указанная в строке «EOF внутри строки», имела строку, содержащую в себе одну метку кавычки. Когда я добавил параметр quoting = csv.QUOTE_NONE, он исправил мою проблему.

    Например:

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

    Сделайте свой внутренний цикл таким образом, чтобы вы могли обнаружить «плохой» файл (и продолжить исследование)

     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 

    У меня такая же проблема, и после добавления этих двух параметров в мой код проблема исчезла.

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

    Python - лучший язык программирования в мире.