Pandas read_csv() выдает ошибку ParserError: Error tokenizing data. C error: EOF inside string
В обработке файлов получаю их из разных источников и разных кодировок. Поэтому в цикле перебираю возможные кодировки из списка en_codings = ['utf-8', "cp1250", "cp1251", "cp1252", "latin1", "utf-8-sig"] и работаю с той, при которой чтение произошло.
Параметры задачи позволяют пропускать "сбойные строки", поэтому использую параметр on_bad_lines="skip" в моем pandas версии 1.4.2. И большинство файлов обрабатываются хоть как то. Иногда встречаются "оборванный" файл, где в последней строке не все элементы. Тогда, несмотря на on_bad_lines="skip" выдается ошибка ParserError: Error tokenizing data. C error: EOF inside string starting at row 4390, хотя по моему разумению ее просто нужно было пропустить...
Файл прилагается: csv файл. Но вот так выглядит последние строки:
Как видно, последняя строчка оборвана.
Хотелось бы найти комбинацию параметров pandas.read_csv(), которая пропускала бы такой вариант плохой строчки. Повторюсь - проблема в том, что она последняя.... такие же строчки в середине файла нормально пропускаются.
Ах да - Windows10.
Добавлено. Проблема локализуется тем, что символ конца файла попался после открытой кавычки, которая инициировала новое поле. Если кавычку ручками поставить -- то файл считывается.
Ответы (3 шт):
На английском SO предлагают добавить такие опции (попробуйте и по отдельности и вместе):
quoting=3, error_bad_lines=False
Фактически 3 - это csv.QUOTE_NONE, но чтобы писать в таком виде нужно подключать дополнительный модуль import csv, после этого можно писать в более понятном виде quoting=csv.QUOTE_NONE.
import csv
import pandas as pd
with open('data.csv', 'r', encoding='utf-8') as file:
reader = csv.DictReader(file)
df = pd.DataFrame(reader)
Нашел такое решение после наводящего ответа @Namerek.
pandas.read_csv - имеет параметр engine По умолчанию он принят как С. Если установить python мой файл файл проходит.
Итак, решение выглядит так:
readed_into_df = pd.read_csv(
str(file_name),
sep=separator,
encoding=en_coding,
on_bad_lines="skip",
engine='python',
)
Главным в этом решении было добавление нового прараметра engine='python' .
Обновление. Признаю решение за вариантом @Namerek. На мелких файлах мой вариант неплох. Но на 1.5Гб чтение затянулось на 40+ минут. Все из за того, что парсится то Python кодом эти 5млн строк...
А вот трюк со чтением в словарь модулем csv справляется за минуту.
Так что - благодарю!!
