Python Pandas Ошибочные данные токенизации

Я пытаюсь использовать панд для манипулирования файлом .csv, но я получаю эту ошибку:

pandas.parser.CParserError: Ошибка токенизации данных. Ошибка С: ожидается 2 поля в строке 3, пила 12

Я пытался читать документы панд, но ничего не нашел.

Мой код прост:

path = 'GOOG Key Ratios.csv'
#print(open(path).read())
data = pd.read_csv(path)

Как я могу решить это? Должен ли я использовать модуль csv или другой язык?

Файл от Морнингстар

Ответ 1

Вы также можете попробовать;

data = pd.read_csv('file1.csv', error_bad_lines=False)

Обратите внимание, что это приведет к пропуску ошибочных строк.

Ответ 2

Это может быть проблема с

  • разделители в ваших данных
  • первый ряд, как заметил @TomAugspurger

Чтобы решить эту проблему, попробуйте указать аргументы sep и/или header при вызове read_csv. Например,

df = pandas.read_csv(fileName, sep='delimiter', header=None)

В приведенном выше коде sep определяет ваш разделитель, а header=None сообщает pandas, что в ваших исходных данных нет строки для заголовков/заголовков столбцов. Таким образом, документация гласит: "Если файл не содержит строки заголовка, вы должны явно передать header = None". В этом случае pandas автоматически создает индексы целых чисел для каждого поля {0,1,2,...}.

Согласно документам, разделитель не должен быть проблемой. В документах говорится, что "если sep равен None [не указан], он попытается автоматически определить это". Однако мне не повезло с этим, включая случаи с очевидными разделителями.

Ответ 3

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

Попробуйте с помощью data = pd.read_csv(path, skiprows=2)

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

У меня была эта проблема, но, возможно, по другой причине. У меня были некоторые запятые в моем 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 != []:
    # Handle the errors however you want

Я начал писать script, чтобы повторно вставить строки в DataFrame, так как неверные строки будут заданы переменной 'line' в приведенном выше коде. Этого можно избежать, просто используя csv reader. Надеемся, разработчики pandas смогут облегчить эту ситуацию в будущем.

Ответ 7

У меня была эта проблема несколько раз. Почти каждый раз, причина в том, что файл, который я пытался открыть, не был правильно сохраненным CSV для начала. И "правильно", я имею в виду, что каждая строка имеет одинаковое количество разделителей или столбцов.

Как правило, это произошло потому, что я открыл CSV в Excel, а затем неправильно сохранил его. Несмотря на то, что расширение файла все еще было .csv, чистый CSV-формат был изменен.

Любой файл, сохраненный с pandas to_csv, будет правильно отформатирован и не должен иметь этой проблемы. Но если вы откроете его с помощью другой программы, это может изменить структуру.

Надеюсь, что это поможет.

Ответ 8

У меня была эта проблема, когда я пытался читать в CSV, не передавая имена столбцов.

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

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

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

Ответ 9

Я столкнулся с той же проблемой. Использование pd.read_table() в том же исходном файле, похоже, сработало. Я не мог проследить причину этого, но это было полезное обходное решение для моего дела. Возможно, кто-то более осведомленный может пролить больше света на то, почему он сработал.

Изменить: Я обнаружил, что эта ошибка ползет, когда у вас есть текст в вашем файле, который не имеет того же формата, что и фактические данные. Обычно это информация заголовка или нижнего колонтитула (более одной строки, поэтому skip_header не работает), которые не будут разделены тем же числом запятых, что и ваши фактические данные (при использовании read_csv). Использование read_table использует вкладку в качестве разделителя, которая может обходить текущую ошибку пользователей, но вводить другие.

Я обычно обойду это, читая лишние данные в файл, затем используйте метод read_csv().

Точное решение может отличаться в зависимости от вашего фактического файла, но этот подход работал у меня в нескольких случаях

Ответ 10

У меня была аналогичная проблема при попытке прочитать таблицу с разделителями табуляции с пробелами, запятыми и кавычками:

1115794 4218    "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", ""
1144102 3180    "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", "g__Bacillus", ""
368444  2328    "k__Bacteria", "p__Bacteroidetes", "c__Bacteroidia", "o__Bacteroidales", "f__Bacteroidaceae", "g__Bacteroides", ""



import pandas as pd
# Same error for read_table
counts = pd.read_csv(path_counts, sep='\t', index_col=2, header=None, engine = 'c')

pandas.io.common.CParserError: Error tokenizing data. C error: out of memory

Это говорит о том, что это имеет какое-то отношение к движку синтаксического анализа (который по умолчанию используется). Может быть, перейдя на python, вы измените что-нибудь в

counts = pd.read_table(path_counts, sep='\t', index_col=2, header=None, engine='python')

Segmentation fault (core dumped)

Теперь это другая ошибка.
Если мы продолжим и попытаемся удалить пробелы из таблицы, ошибка от python-engine изменится еще раз:

1115794 4218    "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae",""
1144102 3180    "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae","g__Bacillus",""
368444  2328    "k__Bacteria","p__Bacteroidetes","c__Bacteroidia","o__Bacteroidales","f__Bacteroidaceae","g__Bacteroides",""


_csv.Error: '   ' expected after '"'

И выясняется, что pandas возникали проблемы с разбором наших строк. Для анализа таблицы с помощью python мне нужно было предварительно удалить все пробелы и кавычки из таблицы. Тем временем C-engine продолжал сбой даже с запятыми в строках.

Чтобы избежать создания нового файла с заменой, я сделал это, так как мои таблицы невелики:

from io import StringIO
with open(path_counts) as f:
    input = StringIO(f.read().replace('", ""', '').replace('"', '').replace(', ', ',').replace('\0',''))
    counts = pd.read_table(input, sep='\t', index_col=2, header=None, engine='python')

TL;DR
Измените механизм синтаксического анализа, старайтесь избегать каких-либо разделительных котировок/запятых/пробелов в ваших данных.

Ответ 11

Использовать разделитель в параметре

pd.read_csv(filename, delimiter=",", encoding='utf-8')

Это будет читать.

Ответ 12

Хотя это не относится к этому вопросу, эта ошибка может также появляться со сжатыми данными. Явная установка значения для kwarg compression разрешила мою проблему.

result = pandas.read_csv(data_source, compression='gzip')

Ответ 13

работает следующая последовательность команд (я теряю первую строку данных -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: Ошибка токенизации данных. Ошибка C: Ожидается 53 поля в строке 1605634, пила 54 Следующее НЕ работает:

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

CParserError: Ошибка токенизации данных. Ошибка C: ожидается 53 поля в строке 1605634, видел 54

Следовательно, в вашей задаче вы должны передать usecols=range(0, 2)

Ответ 14

В наборе данных, который я использовал, было много кавычек ("), использующих постороннее форматирование. Я смог исправить ошибку, включив этот параметр для read_csv():

quoting=3 # 3 correlates to csv.QUOTE_NONE for pandas

Ответ 15

Иногда проблема заключается не в том, как использовать python, а в необработанных данных.
Я получил сообщение об ошибке

Error tokenizing data. C error: Expected 18 fields in line 72, saw 19.

Оказалось, что в описании столбца иногда присутствуют запятые. Это означает, что файл CSV необходимо очистить или использовать другой разделитель.

Ответ 16

использовать pandas.read_csv('CSVFILENAME',header=None,sep=', ')

при попытке прочитать данные csv по ссылке

http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data

Я скопировал данные с сайта в мой csvfile. У него были лишние пробелы, поэтому использовали sep = ',', и это сработало :)

Ответ 17

Альтернатива, которую я нашел полезной при работе с подобными ошибками синтаксического анализа, использует модуль CSV для перенаправления данных в pandas df. Например:

import csv
import pandas as pd
path = 'C:/FileLocation/'
file = 'filename.csv'
f = open(path+file,'rt')
reader = csv.reader(f)

#once contents are available, I then put them in a list
csv_list = []
for l in reader:
    csv_list.append(l)
f.close()
#now pandas has no problem getting into a df
df = pd.DataFrame(csv_list)

Я считаю, что модуль CSV немного более устойчив к плохо отформатированным файлам, разделенным запятыми, и поэтому успешно справился с этим путем для решения подобных проблем.

Ответ 18

Следующее сработало для меня (я опубликовал этот ответ, потому что у меня была эта проблема в записной книжке Google Colab Laboratory):

df = pd.read_csv("/path/foo.csv", delimiter=';', skiprows=0, low_memory=False)

Ответ 19

У меня был набор данных с предварительными номерами строк, я использовал index_col:

pd.read_csv('train.csv', index_col=0)

Ответ 20

Это то, что я сделал.

sep='::' решил мою проблему:

data=pd.read_csv('C:\\Users\\HP\\Downloads\\NPL ASSINGMENT 2 imdb_labelled\\imdb_labelled.txt',engine='python',header=None,sep='::')

Ответ 21

У меня был похожий случай как это и настройка

train = pd.read_csv('input.csv' , encoding='latin1',engine='python') 

работал

Ответ 22

У меня та же проблема, когда read_csv: ParserError: Ошибка токенизации данных. Я просто сохранил старый CSV файл в новый CSV файл. Проблема решена!

Ответ 23

Простое разрешение: откройте файл csv в excel & сохраните его с другим именем файла формата CSV. Снова попробуйте импортировать его spyder, Ваша проблема будет решена!

Ответ 24

У меня была аналогичная ошибка, и проблема заключалась в том, что у меня были некоторые экранированные кавычки в моем файле csv и необходимо было правильно установить параметр escapechar.

Ответ 25

Возможно, проблема связана с файлом. В моем случае проблема была решена после переименования файла. еще предстоит выяснить причину..

Ответ 26

Проблема для меня заключалась в том, что новая колонка была добавлена к моему CSV в течение дня. Решение с принятым ответом не будет работать, так как каждая будущая строка будет отброшена, если я использую error_bad_lines=False.

Решением в этом случае было использовать usecols параметр в pd.read_csv(). Таким образом, я могу указать только те столбцы, которые мне нужно прочитать в CSV, и мой код Python останется устойчивым к будущим изменениям CSV, пока существует столбец заголовка (и имена столбцов не меняются).

usecols : list-like or callable, optional 

Return a subset of the columns. If list-like, all elements must either
be positional (i.e. integer indices into the document columns) or
strings that correspond to column names provided either by the user in
names or inferred from the document header row(s). For example, a
valid list-like usecols parameter would be [0, 1, 2] or ['foo', 'bar',
'baz']. Element order is ignored, so usecols=[0, 1] is the same as [1,
0]. To instantiate a DataFrame from data with element order preserved
use pd.read_csv(data, usecols=['foo', 'bar'])[['foo', 'bar']] for
columns in ['foo', 'bar'] order or pd.read_csv(data, usecols=['foo',
'bar'])[['bar', 'foo']] for ['bar', 'foo'] order.

пример

my_columns = ['foo', 'bar', 'bob']
df = pd.read_csv(file_path, usecols=my_columns)

Еще одним преимуществом этого является то, что я могу загружать намного меньше данных в память, если я использую только 3-4 столбца CSV, который имеет 18-20 столбцов.

Ответ 27

Я столкнулся с этой ошибкой с кавычками. Я использую картографическое программное обеспечение, которое ставит кавычки вокруг текстовых элементов при экспорте файлов с разделителями-запятыми. Текст, который использует кавычки (например, '= футы и "= дюймы), может быть проблематичным. Рассмотрим этот пример, который отмечает, что 5-дюймовая печать каротажа скважины плохая:

UWI_key,Latitude,Longitude,Remark US42051316890000,30.4386484,-96.4330734,"poor 5""

Использование 5" качестве сокращения для 5 inch приводит к тому, что в работах появляется гаечный ключ. Excel просто error_bad_lines=False лишних кавычек, но Pandas ломается без аргумента error_bad_lines=False упомянутого выше.

Ответ 28

Я столкнулся с этой ошибкой с кавычками. Я использую картографическое программное обеспечение, которое ставит кавычки вокруг текстовых элементов при экспорте файлов с разделителями-запятыми. Текст, который использует кавычки (например, '= футы и "= дюймы), может быть проблематичным. Рассмотрим этот пример, который отмечает, что 5-дюймовая печать каротажа скважины плохая:

UWI_key,Latitude,Longitude,Remark US42051316890000,30.4386484,-96.4330734,"poor 5""

Использование 5" качестве сокращения для 5 inch приводит к тому, что в работах появляется гаечный ключ. Excel просто error_bad_lines=False лишних кавычек, но Pandas ломается без аргумента error_bad_lines=False упомянутого выше.

Как только вы узнаете природу вашей ошибки, может быть проще всего выполнить Find-Replace из текстового редактора (например, Sublime Text 3 или Notepad++) перед импортом.

Ответ 29

Большинство полезных ответов уже упоминалось, однако я предлагаю сохранить кадры данных pandas в виде файла паркета. У файлов паркета нет этой проблемы, и они в то же время экономят память.

Ответ 30

Для тех, у кого похожая проблема с Python 3 в ОС Linux.

pandas.errors.ParserError: Error tokenizing data. C error: Calling
read(nbytes) on source failed. Try engine='python'.

Попробуйте:

df.read_csv('file.csv', encoding='utf8', engine='python')