Подтвердить что ты не робот

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 

Edit

Мне удалось найти файл, создавший эту проблему. Я думаю, что он читает символ 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()

Edit

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

4b9b3361

Ответ 1

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

Например:

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

Решение состоит в использовании параметра engine = python в функции read_csv. Парсер 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 документации.

engine : {‘c’, ‘python’}

Ответ 5

Для меня другие решения не помогли и вызвали у меня головную боль. error_bad_lines = False все еще дает ошибку C error: EOF inside string starting at line. Использование другого цитирования не дало желаемых результатов, так как я не хотел иметь кавычки в своем тексте.

Я понял, что была ошибка в Pandas 0.20. Обновление до версии 0.21 полностью решило мою проблему. Подробнее об этой ошибке см.: https://github.com/pandas-dev/pandas/issues/16559

Примечание. Это может быть связано с Windows, как указано в URL-адресе.