Pandas: read_csv "CParserError: Ошибка токенизации данных" с переменным количеством полей

Созданный на 31 окт. 2015  ·  17Комментарии  ·  Источник: pandas-dev/pandas

У меня возникают проблемы с read_csv (Pandas 0.17.0) при попытке прочитать csv-файл размером 380+ МБ. Файл начинается с 54 полей, но в некоторых строках 53 поля вместо 54. Выполнение приведенного ниже кода дает мне следующую ошибку:

parser = lambda x: datetime.strptime(x, '%y %m %d %H %M %S %f')
df = pd.read_csv(filename,
                         names=['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND',
                                'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS',
                                'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2',
                                'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6',
                                'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10',
                                'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14'],
                        usecols=range(0, 42),
                        parse_dates={"TIMESTAMP": [0, 1, 2, 3, 4, 5, 6]},
                        date_parser=parser,
                        header=None)

Ошибка:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

Если я передам ключевое слово error_bad_lines=False , отобразятся проблемные строки, как в примере ниже:

Skipping line 1683401: expected 53 fields, saw 54

однако на этот раз я получаю следующую ошибку (также DataFrame не загружается):

CParserError: Too many columns specified: expected 54 and found 53

Если я передаю ключевое слово engine='python' , я не получаю никаких ошибок, но анализ данных занимает очень много времени. Обратите внимание, что 53 и 54 меняются местами в сообщениях об ошибках в зависимости от того, используется ли error_bad_lines=False или нет.

IO CSV Usage Question

Самый полезный комментарий

Попробуй это:

  df = pd.read_csv(filename,header=None,error_bad_lines=False)

Все 17 Комментарий

все эти ошибки верны. вы ограничиваете действия парсера, передавая usecols и names . не делайте этого и посмотрите, сможете ли вы его разобрать.

очень сложно диагностировать что-то подобное без образца воспроизводимого файла.

также показать pd.show_versions()

С исходным файлом данных:

pd.read_csv(filename) без других ключевых слов, похоже, анализирует данные без ошибок. pd.read_csv(filename, header=None) выдает следующую ошибку:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

Полностью согласен, что без выборочных данных поставить диагноз очень сложно. Я попытался сгенерировать ошибку с помощью файла csv с несколькими строками (некоторые из них имеют 53 поля, некоторые 54), pd.read_csv заполняет пробелы с помощью NaN, как ожидалось. Я повторил, передав usecols и header=None , все еще работает. Кажется, что в исходном файле есть какая-то проблема, которая вызывает все ошибки.

pd.show_versions() выводит следующим образом:

INSTALLED VERSIONS
------------------
commit: None
python: 2.7.10.final.0
python-bits: 64
OS: Windows
OS-release: 7
machine: AMD64
processor: Intel64 Family 6 Model 58 Stepping 9, GenuineIntel
byteorder: little
LC_ALL: None
LANG: None

pandas: 0.17.0
nose: 1.3.7
pip: 7.1.2
setuptools: 18.4
Cython: 0.22.1
numpy: 1.10.1
scipy: 0.16.0
statsmodels: 0.6.1
IPython: 3.2.0
sphinx: 1.3.1
patsy: 0.3.0
dateutil: 2.4.2
pytz: 2015.6
blosc: None
bottleneck: 1.0.0
tables: 3.2.0
numexpr: 2.4.3
matplotlib: 1.4.3
openpyxl: 1.8.5
xlrd: 0.9.3
xlwt: 1.0.0
xlsxwriter: 0.7.3
lxml: 3.4.4
bs4: 4.3.2
html5lib: None
httplib2: None
apiclient: None
sqlalchemy: 1.0.5
pymysql: None
psycopg2: None
pd.read_csv(filename, header=None) gives the following error:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

ожидается, так как количество столбцов выводится из первой строки. Если вы передадите names if будет использовать это как определяющую функцию.

Так что продолжайте пробовать разные варианты. На самом деле вы немного ограничиваете его с помощью names и usecols . Возможно, вам будет лучше прочитать его, а затем переиндексировать на то, что вам нужно.

Как ни странно, если используется engine='python' , он загружает DataFrame без каких-либо сбоев. Я использовал следующий фрагмент, чтобы извлечь первые 3 строки в файле и 3 строки с нарушением (номера строк получены из сообщения об ошибке).

from csv import reader
N = int(input('What line do you need? > '))
with open(filename) as f:
    print(next((x for i, x in enumerate(reader(f)) if i == N), None))

Строки 1-3:

['08', '8', '7', '5', '0', '12', '54', '0', '11', '1', '58', '9', '68', '48.2', '0.756', '11.6', '17.5', '13.3', '4.3', '11.3', '32.2', '6.4', '4.1', '5.6', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['08', '8', '7', '5', '0', '15', '80', '0', '11', '1', '62', '9', '69', '77.8', '3.267', '11.2', '17.7', '14.8', '4.2', '15.2', '29.1', '18.4', '10.0', '18.1', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['08', '8', '7', '5', '0', '21', '52', '0', '11', '1', '61', '11', '51', '29.4', '0.076', '4.1', '13.8', '8.3', '21.5', '5.3', '3.1', '5.7', '3.0', '6.1', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']

Оскорбительные строки:

['09', '9', '15', '22', '46', '9', '51', '0', '11', '1', '57', '9', '70', '36.3', '0.242', '11.8', '16.2', '6.4', '4.1', '5.8', '31.3', '5.5', '3.9', '6.8', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['09', '9', '15', '22', '46', '25', '31', '0', '11', '1', '70', '9', '73', '67.8', '2.196', '10.4', '17.0', '13.4', '4.4', '12.2', '31.8', '15.6', '4.2', '16.2', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['09', '9', '15', '22', '46', '28', '41', '0', '11', '1', '70', '5', '22', '7.4', '0.003', '4.0', '13.1', '3.4', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']

Как вы предложили, я попытаюсь прочитать файл, а затем изменить DataFrame (переименовать столбцы, удалить ненужные и т. Д.) Или просто использовать движок python (длительное время обработки).

При дальнейшем исследовании работает следующая последовательность команд (я теряю первую строку данных -no header=None present-, но, по крайней мере, она загружается):

df = pd.read_csv(filename, 
                 usecols=range(0, 42))
df.columns = ['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND',
                        'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS',
                        'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2',
                        'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6',
                        'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10',
                        'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14']

Следующее НЕ работает:

df = pd.read_csv(filename,
                 names=['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND',
                        'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS',
                        'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2',
                        'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6',
                        'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10',
                        'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14'],
                 usecols=range(0, 42))

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

Следующее НЕ работает:

df = pd.read_csv(filename,
                 header=None)

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

закрытие как вопрос использования.

dic_df = _create_init_dic ("C: / Users / swati / Downloads / VQA-Med 2018 Dataset / c5e905f7-6eb0-4a98-b284-da0729a1caf3_VQAMed2018Train / VQAMed2018Train / VQAMed2018Train)-QA.
ParserError: ошибка токенизации данных. Ошибка C: ожидается 1 поле в строке 33, увидено 3

Попробуй это:

  df = pd.read_csv(filename,header=None,error_bad_lines=False)

Пробовал и работал с аналогичной ошибкой, спасибо!

попробуйте добавить quoting=3 при чтении

есть ли способ для панд просто игнорировать дополнительные поля в любой строке, в которой есть больше полей?
например, в случае "Ожидается 53 поля в строке 1605634, видел 54"
он просто отбрасывает поле 54 в строке 1605634

Другой случай! но разрешается с помощью «error_bad_lines = False», он по-прежнему выводит ошибку, но «код выхода 0»

У меня такая же ошибка

Я просто добавляю параметр- разделитель в режиме read_csv

и это сработало

error_bad_lines = Ложь
оно работает

pd.read_csv(filename, header=None) gives the following error:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

ожидается, так как количество столбцов выводится из первой строки. Если вы передадите names if будет использовать это как определяющую функцию.

Так что продолжайте пробовать разные варианты. На самом деле вы немного ограничиваете его с помощью names и usecols . Возможно, вам будет лучше прочитать его, а затем переиндексировать на то, что вам нужно.

Это работает! Я пишу csv на языке R и пытаюсь прочитать его на python. Первая строка должна иметь максимальную длину для всех строк. Это решит проблему плохих линий и не потеряет ни одной строки.

Если вы попытаетесь импортировать файл .xlsx с помощью команды pd.read_csv, вы получите эту ошибку.

Попробуйте использовать pd.read_excel вместо pd.read_csv

Самый простой способ исправить это - преобразовать файл CSV в файл Excel и использовать pd.read_excel вместо pd.read_csv для чтения данных.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги