«Строка содержит нулевой байт» в программе чтения CSV (Python) - PullRequest
72 голосов
/ 25 октября 2011

Я пытаюсь написать программу, которая просматривает файл .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

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

Ответы [ 9 ]

59 голосов
/ 25 октября 2011

Я предполагаю, что у вас есть 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.

57 голосов
/ 27 марта 2012

Я решил похожую проблему с помощью более простого решения:

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

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

8 голосов
/ 25 ноября 2014

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

См. (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)
7 голосов
/ 26 октября 2011

Это скажет вам, в чем заключается проблема.

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 голосов
/ 08 мая 2018

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

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

r = csv.reader(fix_nulls(open(...)))
2 голосов
/ 11 августа 2017

Хитрый способ:

Если вы разрабатываете в 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

1 голос
/ 09 марта 2017

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

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
1 голос
/ 29 июля 2016

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

0 голосов
/ 14 мая 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...