"Строка содержит NULL-байт" в CSV-ридере (Python) - программирование
Подтвердить что ты не робот

"Строка содержит 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

Благодарим всех людей здесь, чтобы даже довести меня до этой точки.

4b9b3361

Ответ 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