Я пытаюсь использовать 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
вы также можете попробовать;
data = pd.read_csv('file1.csv', error_bad_lines=False)
Обратите внимание, что при этом будут пропущены строки с ошибками.
Это может быть проблема с
Чтобы ее решить, попробуйте указать сентября
и доводы заголовок/или при вызове read_csv
. Например,
df = pandas.read_csv(fileName, sep='delimiter', header=None)
В приведенном выше коде, сентября
определяет ваш разделителя и заголовка=нет` говорит панд, что ваш источник данных не имеет строку для заголовков / названий столбцов. Так говорит документации: "Если файл не содержит строку заголовка, то вы должны явно передавать заголовок=нет и". В данном случае, панды автоматически создает целый ряд индексов для каждого поля {0,1,2,...}.
Согласно документов, что разделитель должен не проблема. Документы говорят, что "если сентября Нет [не указано], будет пытаться автоматически определить это.quot; Я, однако, не имел удачи с этим, в том числе экземпляры с явными разделителями.
Парсер путается в заголовке файла. Он считывает первую строку и по ней определяет количество столбцов. Но первые две строки не являются репрезентативными для фактических данных в файле.
Попробуйте сделать это с data = pd.read_csv(path, skiprows=2)
.
CSV-файл может иметь переменное количество столбцов и read_csv
вывести количество столбцов с первых строк. Два пути ее решения в этом случае:
изменить CSV-файл с пустой первой строке максимальное количество столбцов (и указать заголовок=[0]`)
или используйте имена = список(диапазон(0,П))
где N-максимальное число столбцов.
Это, безусловно, вопрос разделитель, как большинство из CSV CSV-файла есть создать с помощью сентября='/т'
чтобы попытаться read_csv с использованием табуляции
(\Т), используя разделитель
/Т`. Итак, попробуем открыть, используя следующую строку кода.
data=pd.read_csv("File_path", sep='\t')
Я имел эту проблему, но, возможно, по другой причине. У меня были некоторые конечные запятые в моем 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 читатель. Будем надеяться, что разработчики панды могут сделать его легче справиться с этой ситуацией в будущем.
У меня была такая проблема, когда я пытаюсь прочитать в CSV без прохождения в имена столбцов.
df = pd.read_csv(filename, header=None)
Я указал имена столбцов в список заранее, а потом сдают их в "имена", и он решил ее немедленно. Если вы Don'т иметь набор имен столбцов, вы могли бы просто создать столько заполнители, как максимальное число столбцов, которые могут быть в ваших данных.
col_names = ["col1", "col2", "col3", ...]
df = pd.read_csv(filename, names=col_names)
Я'вэ имел эту проблему несколько раз сама. Почти каждый раз, причина в том, что файл, который я пытаюсь открыть не был правильно сохранен в формате CSV для начала. И как "правильно" не, я имею в виду в каждой строке было одинаковое количество разделителей или столбцов.
Как правило, это случилось потому, что я открыл CSV в Excel, а затем неправильно его сохранили. Хотя расширение было до сих пор .CSV, формат чистого КШМ была изменена.
Любой файл, сохраненный с пандами 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
Это говорит, что это как-то связано с разбором двигателя (который по умолчанию). Может быть, изменения к 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')
многабукаф. <БР> Изменение механизма анализа, попытаться избежать любой не-отграничение кавычки/запятые/пробелы в данных.
Набор данных, который я использовал много кавычек (" В) использовать посторонние форматирования. Я был в состоянии исправить ошибку, включив этот параметр для read_csv()
:
``питон цитирую=3 # 3 корреляты в CSV.QUOTE_NONE для панд
Использовать разделитель в параметр
pd.read_csv(filename, delimiter=",", encoding='utf-8')
Он будет читать.
Хотя и не дело на этот вопрос, эта ошибка может также появиться со сжатыми данными. Явно установите значение kwarg
сжатия
решить мою проблему.
result = pandas.read_csv(data_source, compression='gzip')
следующая последовательность команд работает (я проиграю в первой строке данных нет заголовка=нет, но по крайней мере его нагрузки):
ДФ = др.read_csv(именем, usecols=диапазон(0, 42)) ДФ.столбцы = ['летнее', 'МО', 'день', 'ч', 'мин', 'сек', 'Хунд', 'ОШИБКА', 'RECTYPE', 'ЛЕЙНА', 'СКОРОСТИ', 'КЛАССА', 'продолжительность', 'полная масса', 'ESAL', 'В1', 'С1', 'П2', 'С2', 'В3', 'С3', 'В4', 'С4', 'В5', 'С5', 'В6', 'С6', 'В W7', 'S7-Сибирь', 'В8', 'С8', 'В9', 'С9', 'В10', 'С10', 'В11', 'С11', 'W12, Который', 'С12', 'W13', '13й', 'В14']
Следующее не работает:
ДФ = др.read_csv(именем, имена=['летнее', 'МО', 'день', 'ч', 'мин', 'сек', 'Хунд', 'ОШИБКА', 'RECTYPE', 'ЛЕЙНА', 'СКОРОСТИ', 'КЛАССА', 'продолжительность', 'полная масса', 'ESAL', 'В1', 'С1', 'П2', 'С2', 'В3', 'С3', 'В4', 'С4', 'В5', 'С5', 'В6', 'С6', 'В W7', 'S7-Сибирь', 'В8', 'С8', 'В9', 'С9', 'В10', 'С10', 'В11', 'С11', 'W12, Который', 'С12', 'W13', '13й', 'В14'], usecols=диапазон(0, 42))
CParserError: сведения об ошибке разбора. Ошибка c: ожидаемые 53 поля в линии 1605634, увидел, 54 Следующее не работает:
ДФ = др.read_csv(именем, заголовок=нет)
CParserError: сведения об ошибке разбора. Ошибка c: ожидаемые 53 поля в линии 1605634, увидел, 54
Следовательно, в вашу проблему вы должны пройти usecols=диапазон(0, 2)
использовать
панды.read_csv('ИМЯ_ФАЙЛА_CSV',заголовок=нет,сентября=', ')
при попытке чтения данных в формате CSV по ссылке
http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data
Я скопировал данные с сайта в мой csvfile, был. Это были лишние пробелы так раньше сентября =', ' и это сработало :)
Альтернатива, что я нашел, чтобы быть полезным при решении аналогичных разбор ошибок использует модуль 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, чтобы быть немного более надежным, чтобы плохо отформатированные файлы с разделителями-запятыми и так имели успех с этим маршрутом для решения подобных вопросов.
Иногда проблема заключается не в том, чтобы использовать Python, но с исходными данными. Я получил это сообщение об ошибке
Error tokenizing data. C error: Expected 18 fields in line 72, saw 19.
Оказалось, что в описании колонки были иногда запятые. Это означает, что файл CSV должен быть очищен или другой используемый разделитель.
Для тех, у кого возникли похожие проблемы с 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')
Насколько я могу судить, и после взглянуть на ваш файл, проблема в том, что 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(путь, сентября='\т+`, заголовок=нет)