it-roy-ru.com

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

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

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

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

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

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

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

Файл из Morningstar

240
abuteau

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

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

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

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

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

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

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

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

53
grisaitis

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

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

29
TomAugspurger

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

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

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

23
computerist

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

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

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

15
Robert Geiger

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

data=pd.read_csv("File_path", sep='\t')
14
Piyush S. Wanare

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

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

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

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

9
elPastor

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

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

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

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

7
Legend_Ari

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

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

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

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 '"'

И становится ясно, что у панд возникли проблемы с анализом наших строк. Чтобы разобрать таблицу с движком Python, мне нужно было заранее удалить все пробелы и кавычки из таблицы. Тем временем C-двигатель продолжал падать даже с запятыми в строках .

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

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
Измените механизм синтаксического анализа, старайтесь избегать любых неразграничивающих кавычек/запятых/пробелов в ваших данных.

4
lotrus28

работает следующая последовательность команд (я теряю первую строку данных -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)

3
kepy97

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

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

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

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

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

2
Bhavesh Kumar

Альтернатива, которую я нашел полезной при работе с подобными ошибками синтаксического анализа, использует модуль 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 немного более устойчив к плохо отформатированным файлам, разделенным запятыми, и поэтому успешно справился с этим путем для решения подобных проблем.

2
bcoz

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

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

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

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

2
Abhishek

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

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

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

2
Kims Sifers

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

1
Simin Zuo

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

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

работал

1
Adewole Adesola

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

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

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

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

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

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

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

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

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

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

0
SQA_LEARN

Вы можете сделать этот шаг, чтобы избежать проблемы - 

train = pd.read_csv('/home/Project/output.csv' , header=None)

просто добавьте - header=None

Надеюсь это поможет!!

0
rahul ranjan

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

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

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

0
Andrew Silver

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

0
jvvw

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

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

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

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

0
Andrew Silver

Для меня проблема заключалась в том, что новый столбец был добавлен к моему 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 столбцов. 

0
Scott Skiles