Python Pandas CSV импорта "Ошибка токенизации данных" - показать содержимое строки ошибки - PullRequest
0 голосов
/ 27 ноября 2018

Я читаю большой CSV-файл

df = pd.read_csv(filename, sep=';',
                 encoding='cp850', quoting=3)

В некоторых строках появляется сообщение об ошибке из-за лишних точек с запятой

Error tokenizing data. C error: 
Expected 33 fields in line 23836, saw 34

При открытии файла в Vim большинствовремя ошибки именно на этой линии.Но иногда это не номер этой строки, а строка / несколько строк выше.

Если я ищу строку вручную, я получаю другой номер строки, то есть номер строки, в которой я нахожу ошибку вредактор.

with open(filename, encoding='cp850') as f1:
    lines = f1.readlines()
    [(e, l) for e, l in enumerate(lines) 
        if len(split(';')) == 34] 

Результат

[(23835, '.....

Так что для этого примера ошибка была не в строке 23836, а в 23835.

Эта проблема возникает как сc и механизм python для read_csv.

Было бы очень полезно, если бы read_csv мог показать содержимое строки ошибки с сообщением об ошибке.

Есть ли способ сделать это?

ОБНОВЛЕНИЕ:

Кажется, что в строках файла импорта есть разрывы строк, и read_csv, кажется, принимает эти строки какисправить, если строка разбита на две строки, так что после 33 полей всегда есть разрыв.Но с этой строки количество строк в сообщении об ошибке больше не соответствует разрывам строк файла.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Создать образец файла с анонимными данными из плохой строки 23835 ± 2 строки ниже:

import re
bad_idx = 23835
with open(filename, 'r') as f_in, open(filename[-4:] + '_dummy.csv', 'w') as f_out:
    for i, line in enumerate(f_in):
        line = re.sub('[a-zA-Z0-9]+', line)
        if (i > bad_idx-3) and (i < bad_idx+3) or i==0:
            f_out.write(line)

Печать плохих строк и списка номеров их строк(На основе 1):

bad_lines = []
with open(filename, 'r') as f:
    n_col = len(f.readline().split(';'))
    for i, line in enumerate(f):
        if len(line.split(';')) != n_col:
            print(i+2, line)
            bad_lines.append(i+2)
print(bad_lines)
0 голосов
/ 27 ноября 2018

Строка с ошибкой является 23836-й строкой файла csv, который будет иметь индекс 23835 при перечислении в Python, поскольку Python имеет нулевую индексацию.

Однако, какова точная причинаошибка?
Если речь идет о строках, у которых слишком много одной или нескольких точек с запятой в конце , то вы можете легко их выбросить, явно прочитав первые 33 столбца:

df = pd.read_csv(filename, sep=';', usecols=range(33), encoding='cp850', quoting=3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...