Я пытаюсь использовать панд для манипулирования файлом .csv, но я получаю эту ошибку:
pandas.parser.CParserError: Ошибка токенизации данных. Ошибка С: ожидается 2 поля в строке 3, пила 12
Я пытался читать документы панд, но ничего не нашел.
Мой код прост:
path = 'GOOG Key Ratios.csv'
#print(open(path).read())
data = pd.read_csv(path)
Как я могу решить это? Должен ли я использовать csv
модуль или другой язык?
Файл от Morningstar
pandas.to_csv()
, МОЖЕТ быть, потому что в именах столбцов есть '\ r', и в этом случае to_csv () фактически записывает последующие имена столбцов в первый столбец фрейма данных, вызывая разница между количеством столбцов в первых X строках. Эта разница является одной из причин ошибки C.pd.read_csv("<path>", sep=";")
. Не используйте Excel для проверки, так как он иногда помещает данные в столбцы по умолчанию и поэтому удаляет разделитель.Ответы:
Вы также можете попробовать;
Обратите внимание, что это приведет к пропуску ошибочных строк.
источник
expected 8 fields, saw 9
?read_csv
. @PetraBarus, почему бы просто не добавить столбцы в файлы CSV, в которых они отсутствуют (с нулевыми значениями при необходимости)?names=["col1", "col2", ...]
максимального числа ожидаемых столбцов, и именно так я решил эту проблему, когда натолкнулся на нее. Смотрите: stackoverflow.com/questions/18039057/…Это может быть проблема с
Чтобы решить эту проблему, попробуйте указать аргументы
sep
and и / илиheader
при вызовеread_csv
. Например,В приведенном выше коде
sep
определяет ваш разделитель иheader=None
сообщает пандам, что в ваших исходных данных нет строки для заголовков / заголовков столбцов. Таким образом, документация гласит : «Если файл не содержит строки заголовка, вы должны явно передать header = None». В этом случае pandas автоматически создает индексы целых чисел для каждого поля {0,1,2, ...}.Согласно документам, разделитель не должен быть проблемой. В документах говорится, что «если sep равен None [не указан], он попытается автоматически определить это». Однако мне не повезло с этим, в том числе с очевидными разделителями.
источник
Парсер запутывается в заголовке файла. Он читает первую строку и выводит количество столбцов из этой строки. Но первые две строки не представляют фактические данные в файле.
Попробуй это с
data = pd.read_csv(path, skiprows=2)
источник
Ваш CSV-файл может иметь переменное количество столбцов и
read_csv
выводить количество столбцов из первых нескольких строк. Два способа решить это в этом случае:1) Измените файл CSV, чтобы иметь фиктивную первую строку с максимальным количеством столбцов (и укажите
header=[0]
)2) Или используйте
names = list(range(0,N))
где N максимальное количество столбцов.источник
Это определенно проблема разделителя, так как большинство CSV-файлов CSV создаются с использованием,
sep='/t'
поэтому попробуйтеread_csv
использовать символ табуляции(\t)
с помощью разделителя/t
. Итак, попробуйте открыть, используя следующую строку кода.источник
У меня тоже была эта проблема, но, возможно, по другой причине. В моем CSV были запятые, которые добавляли дополнительный столбец, который панды пытались прочитать. Использование следующего работает, но он просто игнорирует плохие строки:
Если вы хотите, чтобы строки обрабатывались с ошибками, нужно сделать что-то вроде следующего:
Я приступил к написанию сценария для повторной вставки строк в DataFrame, поскольку плохие строки будут заданы переменной 'line' в приведенном выше коде. Этого можно избежать, просто используя csv reader. Надеемся, что разработчики панд помогут в будущем справиться с этой ситуацией.
источник
У меня была эта проблема, когда я пытался читать в CSV, не передавая имена столбцов.
Я заранее указал имена столбцов в списке, а затем передал их
names
, и это сразу же решилось. Если у вас нет заданных имен столбцов, вы можете просто создать столько имен заполнителей, сколько максимальное количество столбцов может быть в ваших данных.источник
У меня была эта проблема несколько раз сам. Почти каждый раз причина в том, что файл, который я пытался открыть, не был должным образом сохраненным CSV для начала. И под «правильно» я подразумеваю, что каждая строка имеет одинаковое количество разделителей или столбцов.
Обычно это происходит потому, что я открыл CSV в Excel, а затем неправильно его сохранил. Несмотря на то, что расширение файла было все еще .csv, чистый формат CSV был изменен.
Любой файл, сохраненный с помощью pandas to_csv, будет правильно отформатирован и не должен иметь такой проблемы. Но если вы откроете его с помощью другой программы, это может изменить структуру.
Надеюсь, это поможет.
источник
Я столкнулся с той же проблемой. Использование
pd.read_table()
одного и того же исходного файла, похоже, работает. Я не мог проследить причину этого, но это был полезный обходной путь для моего случая. Возможно, кто-то более знающий может пролить больше света на то, почему это работает.Изменить: я обнаружил, что эта ошибка появляется, когда у вас есть текст в вашем файле, который не имеет тот же формат, что и фактические данные. Обычно это информация верхнего или нижнего колонтитула (больше, чем одна строка, поэтому skip_header не работает), которая не будет разделена тем же количеством запятых, что и ваши фактические данные (при использовании read_csv). При использовании read_table в качестве разделителя используется вкладка, которая может обойти текущую ошибку пользователя, но представить другие.
Я обычно обхожу это путем чтения дополнительных данных в файл, а затем использую метод read_csv ().
Точное решение может отличаться в зависимости от вашего фактического файла, но этот подход работал для меня в нескольких случаях
источник
Следующее работает для меня (я опубликовал этот ответ, потому что у меня была эта проблема в записной книжке Google Colab Laboratory):
источник
|
в качестве разделителя для моего .csv. Я предпочитаю сначала попробовать этот подход, а не пропускать строки или плохие строки.У меня была похожая проблема при попытке прочитать таблицу с разделителями табуляции пробелами, запятыми и кавычками:
Это говорит о том, что это как-то связано с механизмом синтаксического анализа языка Си (по умолчанию). Может быть, переход на питон изменит что-нибудь
Теперь это другая ошибка.
Если мы пойдем дальше и попытаемся удалить пробелы из таблицы, ошибка в python-engine снова изменится:
И становится ясно, что у панд возникли проблемы с анализом наших строк. Для разбора таблицы с помощью Python Engine мне нужно было заранее удалить все пробелы и кавычки из таблицы. Тем временем C-двигатель продолжал падать даже с запятыми в строках.
Чтобы избежать создания нового файла с заменами, я сделал это, так как мои таблицы маленькие:
tl; dr
Измените механизм синтаксического анализа, постарайтесь избегать любых не разделяющих кавычек / запятых / пробелов в ваших данных.
источник
В наборе данных, который я использовал, было много кавычек ("), использующих постороннее форматирование. Я смог исправить ошибку, включив этот параметр для
read_csv()
:источник
Использовать разделитель в параметре
Это будет читать.
источник
Хотя это и не относится к этому вопросу, эта ошибка также может появляться со сжатыми данными. Явно установив значение для
kwarg
compression
решенной моей проблемы.источник
Альтернатива, которую я нашел полезной при работе с подобными ошибками синтаксического анализа, использует модуль CSV для перенаправления данных в pandas df. Например:
Я считаю, что модуль CSV немного более устойчив к плохо отформатированным файлам, разделенным запятыми, и поэтому успешно справился с этим путем для решения подобных проблем.
источник
работает следующая последовательность команд (я теряю первую строку данных -no header = None присутствует-, но по крайней мере она загружается):
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)
источник
Для тех, у кого похожая проблема с Python 3 на ОС Linux.
Пытаться:
источник
Иногда проблема не в том, как использовать python, а в необработанных данных.
Я получил это сообщение об ошибке
Оказалось, что в описании колонки были иногда запятые. Это означает, что файл CSV необходимо очистить или использовать другой разделитель.
источник
использование
pandas.read_csv('CSVFILENAME',header=None,sep=', ')
при попытке прочитать данные csv по ссылке
http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data
Я скопировал данные с сайта в мой csvfile. У него были лишние пробелы, поэтому использовали sep = ',', и это сработало :)
источник
У меня был набор данных с существующими номерами строк, я использовал index_col:
источник
Это то, что я сделал.
sep='::'
решил мою проблему:источник
У меня был похожий случай как это и настройка
работал
источник
У меня та же проблема, когда read_csv: ParserError: Ошибка токенизации данных. Я просто сохранил старый CSV-файл в новый CSV-файл. Проблема решена!
источник
Проблема для меня заключалась в том, что новая колонка была добавлена к моему CSV в течение дня . Принятое решение ответа не будет работать, поскольку каждая будущая строка будет отброшена, если я использую
error_bad_lines=False
.Решением в этом случае было использование параметра usecols в
pd.read_csv()
. Таким образом, я могу указать только те столбцы, которые мне нужно прочитать в CSV, и мой код Python останется устойчивым к будущим изменениям CSV, пока существует столбец заголовка (и имена столбцов не меняются).пример
Еще одним преимуществом этого является то, что я могу загружать намного меньше данных в память, если я использую только 3-4 столбца CSV, который имеет 18-20 столбцов.
источник
Простое разрешение : откройте файл CSV в Excel и сохраните его с другим именем файла формата CSV. Снова попробуйте импортировать его spyder, Ваша проблема будет решена!
источник
Я столкнулся с этой ошибкой с кавычками. Я использую картографическое программное обеспечение, которое ставит кавычки вокруг текстовых элементов при экспорте файлов с разделителями-запятыми. Текст, который использует кавычки (например, '= футы и "= дюймы), может вызвать проблемы, когда затем вызывает столкновения с разделителями. Рассмотрим этот пример, который отмечает, что 5-дюймовая печать каротажа скважины плохая:
UWI_key,Latitude,Longitude,Remark US42051316890000,30.4386484,-96.4330734,"poor 5""
Использование в
5"
качестве сокращения для того5 inch
, чтобы бросать гаечный ключ в работах. Excel просто удалит лишнюю кавычку, но Pandas сломается безerror_bad_lines=False
аргумента, упомянутого выше.источник
Насколько я могу судить, проблема заключается в том, что у файла CSV, который вы пытаетесь загрузить, несколько таблиц. Есть пустые строки или строки, содержащие названия таблиц. Попробуйте взглянуть на этот ответ Stackoverflow . Это показывает, как достичь этого программно.
Другим динамическим подходом для этого будет использование модуля CSV , чтение каждой строки за раз и выполнение проверок работоспособности / регулярных выражений, чтобы определить, является ли строка (title / header / values / blank). У вас есть еще одно преимущество в этом подходе: вы можете разделять / добавлять / собирать ваши данные в объектах Python по желанию.
Проще всего было бы использовать функцию pandas
pd.read_clipboard()
после ручного выбора и копирования таблицы в буфер обмена, если вы можете открыть CSV в Excel или что-то еще.Не имеет значения :
Кроме того, не имеет отношения к вашей проблеме, но потому что никто не упомянул об этом : у меня была такая же проблема при загрузке некоторых наборов данных, таких как
seeds_dataset.txt
из UCI. В моем случае ошибка произошла, потому что некоторые разделители имели больше пробелов, чем истинная вкладка\t
. Например, смотрите строку 3 в следующемПоэтому используйте
\t+
в шаблоне разделителя вместо\t
.источник
В моем случае это потому, что формат первых и последних двух строк файла CSV отличается от среднего содержимого файла.
Поэтому я открываю файл csv в виде строки, анализирую содержимое строки, а затем использую
read_csv
для получения фрейма данных.источник
В моем случае разделитель был не по умолчанию ",", а Tab.
Примечание: «\ t» не работает, как предлагают некоторые источники. Требуется \\ t.
источник
У меня была похожая ошибка, и проблема заключалась в том, что у меня были некоторые экранированные кавычки в моем CSV-файле, и мне нужно было правильно установить параметр escapechar.
источник