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



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




панды.синтаксический анализатор.CParserError: ошибка маркирования данных. C ошибка: ожидается 2 поля в строке 3, увидел 12




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



мой код очень простой:



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


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



файл из Морнингстар

6683   19  

19 ответов:

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

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

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

  • разделители в
  • первая строка, как отметил @TomAugspurger

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

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

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

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

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

попробуйте data = pd.read_csv(path, skiprows=2)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Это говорит, что это имеет какое-то отношение к C parsing engine (который является стандартным). Может быть, переход на 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 '"'

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

следующая последовательность команд работает (я теряю первую строку данных-нет заголовка=нет настоящего -, но по крайней мере он загружается):

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, saw 54

следовательно, в вашей проблеме вы должны пройти usecols=range(0, 2)

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

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

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

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

надеюсь, что это помогает!!

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

попробуй: pandas.read_csv(path, sep = ',' ,header=None)

Comments

    Ничего не найдено.