"Строка содержит нулевой байт" в CSV reader (Python)



Я пытаюсь написать программу, которая смотрит на .Файл CSV (вход.csv) и переписывает только те строки, которые начинаются с определенного элемента (исправлено.csv), как указано в текстовом файле (вывод.формат 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:Python32Sample ProgramcsvParser.py", line 12, in <module>
for row in reader:
_csv.Error: line contains NULL byte


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

957   8  

8 ответов:

Я решил аналогичную проблему с более простым решением:

import codecs
csvReader = csv.reader(codecs.open('file.csv', 'rU', 'utf-16'))

ключ использовал модуль кодеков, чтобы открыть файл с кодировкой UTF-16, есть намного больше кодировок, проверьте документация.

Я предполагаю, что у вас есть байт NUL во входных данных.csv. Вы можете проверить это с помощью

if '' in open('input.csv').read():
    print "you have null bytes in your input file"
else:
    print "you don't"

Если вы

reader = csv.reader(x.replace('', '') for x in mycsv)

возможно, вы что. Или это может означать, что у вас есть utf16 или что-то "интересное".CSV-файл.

вы можете просто встроить генератор, чтобы отфильтровать нулевые значения, если вы хотите притвориться, что их не существует. Конечно, это предполагает, что нулевые байты на самом деле не являются частью кодировки и действительно являются каким-то ошибочным артефактом или ошибкой.

посмотреть (line.replace('','') for line in f) ниже, Также вы, вероятно, захотите открыть этот файл с помощью mode 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('','') for line in mycsv) )
        for row in reader:
            if row[0] not in lines:
                writer.writerow(row)

это скажет вам, какая линия является проблемой.

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: "ошибка выполнения! строка содержит нулевой байт". Есть идеи о первопричине этой ошибки?

...

хорошо, я получил его и думал, что я опубликую решение. Просто еще не вызвал меня горе... Файл был сохранен в .формате xls вместо один.КШМ не поймайте это, потому что само имя файла имело.расширение csv в то время как тип был неподвижен .xls

Если вы хотите заменить нули с чем-то вы можете сделать это:

def fix_nulls(s):
    for line in s:
        yield line.replace('', ' ')

r = csv.reader(fix_nulls(open(...)))

Я недавно исправил эту проблему, и в моем случае это был сжатый файл, который я пытался прочитать. Проверьте формат файла. Затем проверьте, что содержимое является то, что расширение относится.

превращение моей среды linux в чистую полную среду UTF-8 сделало трюк для меня. Попробуйте выполнить следующие действия в командной строке:

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8

сложный способ:

Если вы развиваетесь под 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

Comments

    Ничего не найдено.