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

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

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

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

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

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

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

Файл взят из Morningstar

Комментарии к вопросу (5)
Решение

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

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

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

Комментарии (9)

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

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

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

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

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

Согласно документов, что разделитель должен не проблема. Документы говорят, что "если сентября Нет [не указано], будет пытаться автоматически определить это.quot; Я, однако, не имел удачи с этим, в том числе экземпляры с явными разделителями.

Комментарии (0)

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

Попробуйте сделать это с data = pd.read_csv(path, skiprows=2).

Комментарии (0)

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

  1. изменить CSV-файл с пустой первой строке максимальное количество столбцов (и указать заголовок=[0]`)

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

Комментарии (0)

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

data=pd.read_csv("File_path", sep='\t')
Комментарии (2)

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

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

Комментарии (0)

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

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

Я указал имена столбцов в список заранее, а потом сдают их в "имена", и он решил ее немедленно. Если вы Don'т иметь набор имен столбцов, вы могли бы просто создать столько заполнители, как максимальное число столбцов, которые могут быть в ваших данных.

col_names = ["col1", "col2", "col3", ...]
df = pd.read_csv(filename, names=col_names)
Комментарии (0)

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

Как правило, это случилось потому, что я открыл CSV в Excel, а затем неправильно его сохранили. Хотя расширение было до сих пор .CSV, формат чистого КШМ была изменена.

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

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

Комментарии (0)

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

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

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

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

Комментарии (0)

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

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-двигатель снова меняется:

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

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

многабукаф. <БР> Изменение механизма анализа, попытаться избежать любой не-отграничение кавычки/запятые/пробелы в данных.

Комментарии (0)

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

``питон цитирую=3 # 3 корреляты в CSV.QUOTE_NONE для панд

Комментарии (1)

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

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

Он будет читать.

Комментарии (0)

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

result = pandas.read_csv(data_source, compression='gzip')
Комментарии (0)

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

ДФ = др.read_csv(именем, usecols=диапазон(0, 42)) ДФ.столбцы = [&#39;летнее&#39;, &#39;МО&#39;, &#39;день&#39;, &#39;ч&#39;, &#39;мин&#39;, &#39;сек&#39;, &#39;Хунд&#39;, &#39;ОШИБКА&#39;, &#39;RECTYPE&#39;, &#39;ЛЕЙНА&#39;, &#39;СКОРОСТИ&#39;, &#39;КЛАССА&#39;, &#39;продолжительность&#39;, &#39;полная масса&#39;, &#39;ESAL&#39;, &#39;В1&#39;, &#39;С1&#39;, &#39;П2&#39;, &#39;С2&#39;, &#39;В3&#39;, &#39;С3&#39;, &#39;В4&#39;, &#39;С4&#39;, &#39;В5&#39;, &#39;С5&#39;, &#39;В6&#39;, &#39;С6&#39;, &#39;В W7&#39;, &#39;S7-Сибирь&#39;, &#39;В8&#39;, &#39;С8&#39;, &#39;В9&#39;, &#39;С9&#39;, &#39;В10&#39;, &#39;С10&#39;, &#39;В11&#39;, &#39;С11&#39;, &#39;W12, Который&#39;, &#39;С12&#39;, &#39;W13&#39;, &#39;13й&#39;, &#39;В14&#39;]

Следующее не работает:

ДФ = др.read_csv(именем, имена=[&#39;летнее&#39;, &#39;МО&#39;, &#39;день&#39;, &#39;ч&#39;, &#39;мин&#39;, &#39;сек&#39;, &#39;Хунд&#39;, &#39;ОШИБКА&#39;, &#39;RECTYPE&#39;, &#39;ЛЕЙНА&#39;, &#39;СКОРОСТИ&#39;, &#39;КЛАССА&#39;, &#39;продолжительность&#39;, &#39;полная масса&#39;, &#39;ESAL&#39;, &#39;В1&#39;, &#39;С1&#39;, &#39;П2&#39;, &#39;С2&#39;, &#39;В3&#39;, &#39;С3&#39;, &#39;В4&#39;, &#39;С4&#39;, &#39;В5&#39;, &#39;С5&#39;, &#39;В6&#39;, &#39;С6&#39;, &#39;В W7&#39;, &#39;S7-Сибирь&#39;, &#39;В8&#39;, &#39;С8&#39;, &#39;В9&#39;, &#39;С9&#39;, &#39;В10&#39;, &#39;С10&#39;, &#39;В11&#39;, &#39;С11&#39;, &#39;W12, Который&#39;, &#39;С12&#39;, &#39;W13&#39;, &#39;13й&#39;, &#39;В14&#39;], usecols=диапазон(0, 42))

CParserError: сведения об ошибке разбора. Ошибка c: ожидаемые 53 поля в линии 1605634, увидел, 54 Следующее не работает:

ДФ = др.read_csv(именем, заголовок=нет)

CParserError: сведения об ошибке разбора. Ошибка c: ожидаемые 53 поля в линии 1605634, увидел, 54

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

Комментарии (0)

использовать панды.read_csv(&#39;ИМЯ_ФАЙЛА_CSV&#39;,заголовок=нет,сентября=&#39;, &#39;)

при попытке чтения данных в формате CSV по ссылке

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

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

Комментарии (0)

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

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

Комментарии (0)

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

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

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

Комментарии (0)

Следующие работал для меня (я разместил этот ответ, потому что я конкретно имел эту проблему в Гугле Colaboratory ноутбука):

df = pd.read_csv("/path/foo.csv", delimiter=';', skiprows=0, low_memory=False)
Комментарии (2)

Для тех, у кого возникли похожие проблемы с 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')
Комментарии (0)

Насколько я могу судить, и после взглянуть на ваш файл, проблема в том, что CSV-файл'вновь пытается загрузить несколько таблиц. Есть пустые строки или строки, содержащие заголовки таблицы. Попробуйте посмотреть на этом сайте StackOverflow answer. Он показывает, как достичь этого программно.

Другой динамический подход, который будет использовать модуля CSV, читал все подряд за один раз и сделать проверку/регулярные выражения, чтобы определить, если строка (заголовок/заголовок/ценностей/бланк). У вас есть еще одно преимущество при таком подходе, что вы можете разделить/добавить/собираем ваши данные в объекты Python, как хотелось бы.

Проще всего будет использовать функцию панды ПД.read_clipboard() после ручного выбора и копирования таблицы в буфер обмена, в случае, если вы можете открыть CSV в Excel или что-то.

Неактуально:

Кроме того, не имеют отношения к вашей проблеме, но, поскольку никто не упомянул об этом: у меня была эта же проблема, при загрузке некоторых данных, таких как seeds_dataset.txt от UCI. В моем случае, ошибка происходит потому, что некоторые сепараторов было больше пробелов, чем истинный разделе . Смотри строку 3 в следующей например

14.38 14.21 0.8951 5.386 3.312 2.462 4.956 1 14.69 14.49 0.8799 5.563 3.259 3.586 5.219 1 14.11 14.1 0.8911 5.42 3.302 2.7 5 1 Поэтому, используйте \т+ в шаблоне разделитель вместо . питон данные = ПД.read_csv(путь, сентября=&#39;\т+`, заголовок=нет)

Комментарии (0)