[python] CSV 리더 (Python)의 “줄에 NULL 바이트 포함”

.CSV 파일 (input.csv)을보고 텍스트 파일 (output.txt)에 나열된대로 특정 요소 (corrected.csv)로 시작하는 행만 다시 쓰는 프로그램을 작성하려고합니다.

지금 내 프로그램은 다음과 같습니다.

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

여기 에있는 모든 사람들 이 저를이 지점까지 데려다 준 것에 감사드립니다.



답변

더 쉬운 솔루션으로 비슷한 문제를 해결했습니다.

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

핵심은 코덱 모듈을 사용하여 UTF-16 인코딩으로 파일을 열었습니다. 더 많은 인코딩이 있습니다 . 문서를 확인하십시오 .


답변

input.csv에 NUL 바이트가 있다고 생각합니다. 당신은 그것을 테스트 할 수 있습니다

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)

주위를 둘러 볼 수 있습니다. 또는 .csv 파일에 utf16 또는 ‘흥미로운’무언가가 있음을 나타낼 수 있습니다.


답변

null을 다른 것으로 바꾸려면 다음을 수행하십시오.

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

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


답변

null 값이 존재하지 않는 척하고 싶다면 생성기를 인라인하여 null 값을 필터링 할 수 있습니다. 물론 이것은 null 바이트가 실제로 인코딩의 일부가 아니며 실제로 일종의 잘못된 아티팩트 또는 버그라고 가정합니다.

(line.replace('\0','') 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('\0','') 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 파일에서 읽을 때 “Runtime Error! line contains NULL byte”라는 오류가 발생합니다. 이 오류의 근본 원인에 대해 아십니까?

좋아, 나는 그것을 얻었고 해결책을 게시 할 것이라고 생각했다. 단순히 슬프게 만들었습니다 … 사용 된 파일이 .csv 대신 .xls 형식으로 저장되었습니다. 파일 이름 자체에 .csv 확장자가 있고 유형은 여전히 ​​.xls이기 때문에이를 인식하지 못했습니다.


답변

까다로운 방법 :

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 확인


답변

최근에이 문제를 해결했으며 제 경우에는 읽으려고했던 압축 된 파일이었습니다. 먼저 파일 형식을 확인하십시오. 그런 다음 내용이 확장이 참조하는 내용인지 확인하십시오.