Я работаю с некоторыми CSV-файлами со следующим кодом:
reader = csv.reader(open(filepath, "rU"))
try:
for row in reader:
print 'Row read successfully!', row
except csv.Error, e:
sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e))
И один файл выдает эту ошибку:
file my.csv, line 1: line contains NULL byte
Что я могу сделать? Google, похоже, предполагает, что это может быть файл Excel, который был неправильно сохранен как .csv. Есть ли способ обойти эту проблему в Python?
== ОБНОВЛЕНИЕ ==
Следуя приведенному ниже комментарию @ JohnMachin, я попытался добавить эти строки в свой скрипт:
print repr(open(filepath, 'rb').read(200)) # dump 1st 200 bytes of file
data = open(filepath, 'rb').read()
print data.find('\x00')
print data.count('\x00')
И вот результат, который я получил:
'\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1\x00\x00\x00\x00\x00\x00\x00\x00\ .... <snip>
8
13834
Таким образом, файл действительно содержит NUL байтов.
od -c
говорит первая строка?Ответы:
Как говорит @ S.Lott, вы должны открывать свои файлы в режиме «rb», а не в режиме «rU». Однако это может НЕ быть причиной вашей текущей проблемы. Насколько мне известно, использование режима «rU» может вас испортить, если они встроены
\r
в данные, но не вызовет никаких других проблем. Я также отмечу, что у вас есть несколько файлов (все открыты с помощью 'rU' ??), но только один вызывает проблемы.Если модуль csv сообщает, что в вашем файле есть байт «NULL» (глупое сообщение, должно быть «NUL»), то вам необходимо проверить, что находится в вашем файле. Я бы посоветовал вам сделать это, даже если использование rb решит проблему.
repr()
является (или хочет быть) вашим другом по отладке. Он однозначно покажет, что у вас есть, независимо от платформы (что полезно для помощников, которые не знают, чтоod
есть или делает). Сделай это:и аккуратно скопируйте / вставьте (не вводите повторно) результат в редактирование вашего вопроса (не в комментарий).
Также обратите внимание, что если файл действительно изворотливый, например, нет \ r или \ n на разумном расстоянии от начала файла, номер строки, сообщаемый с помощью,
reader.line_num
будет (бесполезно) 1. Найдите, где находится первое\x00
(если есть), выполниви убедитесь, что вы сбрасываете по крайней мере это количество байтов с помощью repr или od.
Что
data.count('\x00')
вам сказать? Если их много, вы можете сделать что-нибудь вродетак что вы можете видеть байты NUL в контексте.
Если вы видите
\x00
на выходе (или\0
на своемod -c
выходе), то у вас определенно есть NUL байт (ы) в файле, и вам нужно будет сделать что-то вроде этого:Кстати, вы просматривали файл (включая последние несколько строк) в текстовом редакторе? Действительно ли он похож на разумный CSV-файл, как и другие (без исключения "NULL byte") файлы?
источник
'\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1
это «подпись», обозначающая файл составного документа OLE2 - например, файл Excel 97-2003 .XLS . Я считаю, что фраза «в текстовом редакторе выглядит как вполне разумный CSV-файл» совершенно невероятно . Вы, должно быть, просматривали другой файл, действительный файл CSV, в другой папке, на другом компьютере или в другое время. Обратите внимание, что вашod
вывод не был из файла XLS.csv.reader
напрямую.fo.write(data.replace('\x00', ''))
бытьfo.write(data.replace(b'\x00', b''))
? Python 3.6 здесь ...У меня это работает.
источник
Чтение его как UTF-16 тоже было моей проблемой.
Вот мой код, который в итоге заработал:
Где location - это каталог вашего CSV-файла.
источник
Я тоже столкнулся с этой проблемой. Используя
csv
модуль Python , я пытался прочитать файл XLS, созданный в MS Excel, и столкнулся сNULL byte
ошибкой, которую вы получали. Я огляделся и нашел модуль xlrd Python для чтения и форматирования данных из файлов электронных таблиц MS Excel. С помощьюxlrd
модуля я не только могу правильно читать файл, но также могу получить доступ ко многим различным частям файла, чего раньше не мог.Я думал, это может тебе помочь.
источник
Преобразование кодировки исходного файла из UTF-16 в UTF-8 решает мою проблему.
Как преобразовать файл в utf-8 в Python?
источник
Вы можете просто встроить генератор для фильтрации нулевых значений, если хотите сделать вид, что их не существует. Конечно, предполагается, что нулевые байты на самом деле не являются частью кодировки, а представляют собой своего рода ошибочный артефакт или ошибку.
источник
Почему вы это делаете?
В документации довольно ясно сказано, что вы должны сделать это:
Для чтения режим должен быть "rb".
http://docs.python.org/library/csv.html#csv.reader
источник
od
или просматривает в текстовом редакторе, он выглядит как совершенно нормальный файл CSV. Однако, когда он выгружает первые несколько байтов с помощью Python repr (), он становится похожим на файл Excel .XLS (который был переименован в расширение CSV).очевидно, что это файл XLS, а не файл CSV, как подтверждают http://www.garykessler.net/library/file_sigs.html
источник
Вместо читателя csv я использую функцию чтения файла и функцию разделения для строки:
источник
У меня такая же ошибка. Сохранил файл в UTF-8, и все заработало.
источник
Это случилось со мной, когда я создал файл CSV с помощью OpenOffice Calc. Этого не произошло, когда я создал файл CSV в своем текстовом редакторе, даже если позже редактировал его с помощью Calc.
Я решил свою проблему, скопировав в текстовом редакторе данные из файла, созданного с помощью Calc, в новый файл, созданный редактором.
источник
У меня была такая же проблема с открытием CSV, созданного из веб-службы, которая вставляла байты NULL в пустые заголовки. Для очистки файла я сделал следующее:
Отказ от ответственности: имейте в виду, что это перезаписывает ваши исходные данные. Убедитесь, что у вас есть его резервная копия. Вы были предупреждены!
источник
Для всех тех, кто ненавидит файловый режим 'rU': я просто попытался открыть файл CSV с компьютера Windows на Mac с файловым режимом 'rb' и получил эту ошибку из модуля csv:
Открытие файла в режиме «rU» работает нормально. Мне нравится универсальный режим новой строки - он избавляет меня от лишних хлопот.
источник
Я столкнулся с этим при использовании scrapy и извлечении заархивированного csv-файла без правильного промежуточного программного обеспечения для распаковки тела ответа перед передачей его csvreader. Следовательно, файл на самом деле не был файлом csv и соответственно выдавал
line contains NULL byte
ошибку.источник
Вы пробовали использовать gzip.open?
Я пытался открыть файл, который был сжат, но имел расширение «.csv» вместо «csv.gz». Эта ошибка продолжала появляться, пока я не использовал gzip.open
источник
В одном случае - если файл CSV содержит пустые строки, эта ошибка может появиться. Перед тем, как мы перейдем к записи или чтению, необходимо проверить строку.
Я решил свою проблему, добавив эту проверку в код.
источник