7

pandas.parser.CParserError: Ошибка при токенизации данных

1

Я пытаюсь использовать 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 ответ(ов)

0

Это определённо проблема с разделителем, так как большинство CSV-файлов создаются с использованием sep='\t' (табуляция). Попробуйте использовать read_csv, указав символ табуляции (\t) в качестве разделителя. Откройте файл с помощью следующей строки кода:

data = pd.read_csv("File_path", sep='\t')
0

Проблема заключается в том, что парсер запутывается из-за заголовка файла. Он считывает первую строку и определяет количество столбцов на основе этого ряда. Однако первые две строки не являются репрезентативными для содержимого файла.

Попробуйте использовать следующий код: data = pd.read_csv(path, skiprows=2). Этот параметр skiprows пропустит первые две строки и позволит парсеру корректно обработать данные.

0

У меня возникла проблема, когда я пытался загрузить CSV-файл, не указывая названия колонок.

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

Я заранее определил названия колонок в списке и передал их в параметр names, и это сразу решило проблему. Если у вас нет установленных названий колонок, вы можете просто создать столько временных названий, сколько есть максимально возможных колонок в ваших данных.

col_names = ["col1", "col2", "col3", ...]
df = pd.read_csv(filename, names=col_names)

Таким образом, вы сможете корректно загрузить данные, даже если в файле отсутствуют заголовки колонок.

0

Ваш файл CSV может иметь переменное количество столбцов, и функция read_csv определила их количество, основываясь на первых нескольких строках. Вот два способа решения этой проблемы:

  1. Измените файл CSV, добавив фиктивную первую строку с максимальным количеством столбцов (и укажите header=[0]).

  2. Либо используйте names = list(range(0, N)), где N — это максимальное количество столбцов.

0

У меня тоже была такая проблема, но, возможно, по другой причине. У меня в 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 упростят работу с этой ситуацией в будущем.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь