pandas.parser.CParserError: Ошибка при токенизации данных
Я пытаюсь использовать pandas для обработки .csv файла, но получаю следующую ошибку:
pandas.parser.CParserError: Error tokenizing data. C error: Expected 2 fields in line 3, saw 12
Я попытался изучить документацию pandas, но не нашел ответы на свою проблему.
Мой код очень простой:
path = 'GOOG Key Ratios.csv'
# print(open(path).read())
data = pd.read_csv(path)
Как я могу решить эту проблему? Должен ли я использовать модуль csv
или попробовать другой язык?
5 ответ(ов)
Это определённо проблема с разделителем, так как большинство CSV-файлов создаются с использованием sep='\t'
(табуляция). Попробуйте использовать read_csv
, указав символ табуляции (\t)
в качестве разделителя. Откройте файл с помощью следующей строки кода:
data = pd.read_csv("File_path", sep='\t')
Проблема заключается в том, что парсер запутывается из-за заголовка файла. Он считывает первую строку и определяет количество столбцов на основе этого ряда. Однако первые две строки не являются репрезентативными для содержимого файла.
Попробуйте использовать следующий код: data = pd.read_csv(path, skiprows=2)
. Этот параметр skiprows
пропустит первые две строки и позволит парсеру корректно обработать данные.
У меня возникла проблема, когда я пытался загрузить CSV-файл, не указывая названия колонок.
df = pd.read_csv(filename, header=None)
Я заранее определил названия колонок в списке и передал их в параметр names
, и это сразу решило проблему. Если у вас нет установленных названий колонок, вы можете просто создать столько временных названий, сколько есть максимально возможных колонок в ваших данных.
col_names = ["col1", "col2", "col3", ...]
df = pd.read_csv(filename, names=col_names)
Таким образом, вы сможете корректно загрузить данные, даже если в файле отсутствуют заголовки колонок.
Ваш файл CSV может иметь переменное количество столбцов, и функция read_csv
определила их количество, основываясь на первых нескольких строках. Вот два способа решения этой проблемы:
Измените файл CSV, добавив фиктивную первую строку с максимальным количеством столбцов (и укажите
header=[0]
).Либо используйте
names = list(range(0, N))
, где N — это максимальное количество столбцов.
У меня тоже была такая проблема, но, возможно, по другой причине. У меня в CSV-файле были лишние запятые, которые добавляли дополнительный столбец, и pandas пытался его прочитать. Использование следующего кода работает, но просто игнорирует проблемные строки:
data = pd.read_csv('file1.csv', error_bad_lines=False)
Если вы хотите сохранить строки, то "грозным" вариантом решения ошибок может быть что-то подобное:
line = []
expected = []
saw = []
cont = True
while cont == True:
try:
data = pd.read_csv('file1.csv', skiprows=line)
cont = False
except Exception as e:
errortype = e.message.split('.')[0].strip()
if errortype == 'Error tokenizing data':
cerror = e.message.split(':')[1].strip().replace(',', '')
nums = [n for n in cerror.split(' ') if str.isdigit(n)]
expected.append(int(nums[0]))
saw.append(int(nums[2]))
line.append(int(nums[1]) - 1)
else:
cerror = 'Unknown'
print('Unknown Error - 222')
if line != []:
# Обработайте ошибки так, как вам нужно
Я решил написать скрипт для повторного добавления строк в DataFrame, так как проблемные строки будут указаны в переменной line
в приведенном выше коде. Этого всего можно избежать, просто используя csv.reader. Надеюсь, разработчики pandas упростят работу с этой ситуацией в будущем.
Запись DataFrame pandas в CSV файл
Как избежать создания индекса при сохранении DataFrame в CSV с помощью pandas
Ошибка UnicodeDecodeError при чтении CSV-файла в Pandas
Преобразование списка словарей в DataFrame pandas
Объединение двух столбцов текста в DataFrame pandas