"Строка содержит NULL-байт" в CSV-ридере (Python)
Я пытаюсь написать программу, которая смотрит на файл .CSV(input.csv) и перезаписывает только строки, которые начинаются с определенного элемента (corrected.csv), как указано в текстовом файле (output.txt).
Вот как выглядит моя программа прямо сейчас:
import csv
lines = []
with open('output.txt','r') as f:
for line in f.readlines():
lines.append(line[:-1])
with open('corrected.csv','w') as correct:
writer = csv.writer(correct, dialect = 'excel')
with open('input.csv', 'r') as mycsv:
reader = csv.reader(mycsv)
for row in reader:
if row[0] not in lines:
writer.writerow(row)
К сожалению, я продолжаю получать эту ошибку, и я не знаю, что это значит.
Traceback (most recent call last):
File "C:\Python32\Sample Program\csvParser.py", line 12, in <module>
for row in reader:
_csv.Error: line contains NULL byte
Благодарим всех людей здесь, чтобы даже довести меня до этой точки.
Ответы
Ответ 1
Я решил проблему с более простым решением:
import codecs
csvReader = csv.reader(codecs.open('file.csv', 'rU', 'utf-16'))
Ключ использовал модуль кодеков, чтобы открыть файл с кодировкой UTF-16, есть намного больше кодировок, проверьте документацию.
Ответ 2
Я предполагаю, что у вас есть NUL-байт в input.csv. Вы можете проверить это с помощью
if '\0' in open('input.csv').read():
print "you have null bytes in your input file"
else:
print "you don't"
если вы это сделаете,
reader = csv.reader(x.replace('\0', '') for x in mycsv)
может помочь вам в этом. Или это может означать, что у вас есть utf16 или что-то интересное в файле .csv.
Ответ 3
Вы можете просто встроить генератор, чтобы отфильтровать нулевые значения, если вы хотите притвориться, что они не существуют. Конечно, это предполагает, что нулевые байты на самом деле не являются частью кодировки и действительно являются своего рода ошибочным артефактом или ошибкой.
См. ниже (line.replace('\0','') for line in f)
, также вы, вероятно, захотите открыть этот файл, используя режим rb
.
import csv
lines = []
with open('output.txt','r') as f:
for line in f.readlines():
lines.append(line[:-1])
with open('corrected.csv','w') as correct:
writer = csv.writer(correct, dialect = 'excel')
with open('input.csv', 'rb') as mycsv:
reader = csv.reader( (line.replace('\0','') for line in mycsv) )
for row in reader:
if row[0] not in lines:
writer.writerow(row)
Ответ 4
Это скажет вам, в чем заключается проблема.
import csv
lines = []
with open('output.txt','r') as f:
for line in f.readlines():
lines.append(line[:-1])
with open('corrected.csv','w') as correct:
writer = csv.writer(correct, dialect = 'excel')
with open('input.csv', 'r') as mycsv:
reader = csv.reader(mycsv)
try:
for i, row in enumerate(reader):
if row[0] not in lines:
writer.writerow(row)
except csv.Error:
print('csv choked on line %s' % (i+1))
raise
Возможно, это от daniweb будет полезно:
Я получаю эту ошибку при чтении из CSV файла: "Ошибка времени выполнения! Строка содержит NULL байт". Любая идея о первопричине этой ошибки?
...
Хорошо, я получил это и думал, что выложу решение. Просто все же причинил мне горе... Использованный файл был сохранен в формате .xls вместо .csv Не перехватил это, потому что само имя файла имело расширение .csv, в то время как тип был все еще .xls
Ответ 5
Если вы хотите заменить пустые значения чем-то, вы можете сделать это:
def fix_nulls(s):
for line in s:
yield line.replace('\0', ' ')
r = csv.reader(fix_nulls(open(...)))
Ответ 6
Сложный способ:
Если вы работаете в Lunux, вы можете использовать все возможности sed:
from subprocess import check_call, CalledProcessError
PATH_TO_FILE = '/home/user/some/path/to/file.csv'
try:
check_call("sed -i -e 's|\\x0||g' {}".format(PATH_TO_FILE), shell=True)
except CalledProcessError as err:
print(err)
Самое эффективное решение для огромных файлов.
Проверено для Python3, Kubuntu
Ответ 7
Я недавно исправил эту проблему, и в моем экземпляре это был сжатый файл, который я пытался прочитать. Сначала проверьте формат файла. Затем проверьте, соответствует ли это содержимое.
Ответ 8
Превращение моей среды Linux в чистую полную среду UTF-8 сделало трюк для меня.
В командной строке выполните следующие действия:
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
Ответ 9
pandas.read_csv теперь обрабатывает различную кодировку UTF при чтении/записи и, следовательно, может иметь дело непосредственно с нулевыми байтами
data = pd.read_csv(file, encoding='utf-16')
см. https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html.
Ответ 10
Я удалил NULL байтов и решил эту проблему, используя однострочную команду из терминала.
tr < file_with_nulls.csv -d '\000' > file_without_nulls.csv