CSV 리더 (Python)의 "줄에 NULL 바이트 포함"


84

.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

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


추측에 불과하지만 input.csv 파일에 빈 줄이 포함되어있는 것 같습니다 (끝에 mebe?). 해당 예외 텍스트에 대해 csvParser.py 파일에서 찾아보십시오.
Sam Ax

실제로 input.csv 파일을 살펴보고 모든 빈 공간을 제거했습니다 ... 여전히 운이 없습니다 (동일한 오류).
James Roseman 2011 년

줄 번호를 정확히 파악하기 위해 카운터 변수를 도입하고 for row in reader루프 내에서 증가시키는 것이 좋습니다 .
codeape

프로그램 자체가 실행되지 않을 때 어떻게해야할지 모르겠습니다. 나는 카운터를 추가하려고 시도했지만 동일한 트레이스 백 오류 만 표시되었습니다.
James Roseman 2011 년

4
.csv에 NULL 바이트가 있습니까? open('input.csv').read().index('\0')그렇게하면 첫 번째 오프셋을 제공합니다.
retracile

답변:


66

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

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

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


4
원래 Excel .xls 파일에서 열었던 LibreOffice에서 만든 CSV 파일에서도 동일한 문제가 발생했습니다. 어떤 이유로 LibreOffice는 CSV 파일을 UTF-16으로 저장했습니다. 파일의 처음 2 바이트를 보면 알 수 있습니다. FF FE이면 UTF-16이라는 좋은 표시기입니다
Tom Dalton 2013

4
파일 에 ASCII 범위를 벗어난 UTF-16 데이터가 포함되어 있으면 csv.reader()처리 할 수 ​​없으며 UnicodeEncodeError대신 s가 표시됩니다.
Martijn Pieters

6
이로 인해 다른 오류가 발생했습니다.UnicodeError: UTF-16 stream does not start with BOM
Cerin

제 경우에는 'utf-16le'.
Paweł Szczur

69

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 또는 '흥미로운'무언가가 있음을 나타낼 수 있습니다.


5
파일에서 NULL 바이트를 찾는 데 +1 ... 불행히도 이제 내 'corrected.csv'파일이 이제 일본어로 읽 힙니다 ...
James Roseman

.csv가 ASCII가 아닌 것 같습니다. 더 많은 도움을 받으려면 .csv의 실제 콘텐츠에 대한 더 많은 정보가 필요할 것이라고 생각합니다. vim 또는 메모장과 같은 텍스트 편집기에서 열어 보셨습니까? 아니면 file input.csv파일 유형을 식별하기 위해 실행 중 입니까?
2011 년

메모장에서 열 었는데 괜찮아 보입니다. CSV는 어떤 모습이어야합니까? Google Analytics에서와 동일하게 읽지 만 데이터 사이에 큰 탭이 있습니다.
James Roseman 2011 년

젠장 ... 탭을 쉼표로 바꾸고 파이썬 프로그램에서 작동하도록하는 방법이 있습니까?
James Roseman 2011 년

1
CSV가 탭으로 구분 된 경우 다음과 같이 지정해야합니다 reader = csv.reader(mycsv, delimiter='\t').. csv 리더가 전체 파일을 쉼표를 찾고 EOF로 가져 오는 것을 상상합니다. 그러나 확실히 인코딩 문제가 있습니다. 파일을 열 때 인코딩을 지정해야합니다.
Steven Rumbalski 2011 년

11

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

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

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

2
null을 공백으로 바꾸는 것은 좋은 선택이 아닙니다. 빈 문자열로 대체하는 나를 위해 일한
마르셀 아시

수율을 어떻게 사용했는지에 대한 질문이 있습니다. 이것이 루프에 있다는 점을 감안할 때 파일을 한 줄씩 읽거나 한 번에 메모리에로드한다는 의미입니까?
mnsr

10

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)

감사! 이것은 NC 선택 결과 파일에서 효과가 있었는데, 실제로 (!)는 한 열의 "0"바이트 대신 널 바이트를 사용합니다. 참조 dl.ncsbe.gov/ENRS/resultsPCT20161108.zip
nealmcb

7

이것은 어떤 라인이 문제인지 알려줄 것입니다.

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이기 때문에이를 인식하지 못했습니다.


1
Traceback (most recent call last): File "C:\Python32\Sample Program\csvParser.py", line 17, in <module> print ('csv choked on line %s' % (i+1)) NameError: name 'i' is not defined
James Roseman 2011 년

확인. 그런 다음 첫 번째 줄에서 질식합니다. 이것을 실행하고 당신이 보는 것을 게시하십시오 :print(open('input.csv', 'r').readlines()[0])
Steven Rumbalski

뭔가 펑키하지만 ... 실행 중입니다. ÿþ/<그것이 붙여 넣을 모든 것입니다 (대부분 블록과 숫자)
James Roseman 2011 년

1
아마도 귀하의 csv는 실제로 csv가 아닙니다. 내 대답의 후반부를 참조하십시오.
Steven Rumbalski 2011 년

오, 완전히 그럴 수 있습니다. 어떻게 고칠 수 있습니까? Google Analytics에서도 직접 저장했습니다 ...
James Roseman 2011 년

2

까다로운 방법 :

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

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


1

내 리눅스 환경을 완전한 UTF-8 환경으로 바꾸는 것이 나를 위해 트릭을 만들었습니다. 명령 줄에서 다음을 시도하십시오.

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

나를 위해 UTF-8로 변경하면 문제가 해결되었습니다. Windows에서는 Notepad ++를 사용하여 형식을 UTF16에서 UTF8로 변경했습니다. 나는 다음 등 추가 라인 LibreOffice와 석회질로 파일을 오픈하고, 삭제
Yuval 교수 Harpaz을

1

이것은 오랫동안 해결되었지만 Keras 및 TensorFlow에서 훈련 데이터로 처리하기 위해 CSV를 읽는 동안 예기치 않은 오류가 발생했기 때문에이 답변을 보았습니다.

제 경우에는 문제가 훨씬 간단했고 의식 할 가치가 있습니다. CSV로 생성되는 데이터가 일관되지 않아 일부 열이 완전히 누락되어이 오류도 발생하는 것으로 보입니다.

교훈 : 이 오류가 표시되는 경우 데이터가 생각한대로 보이는지 확인하십시오!


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.