복붙노트

[PYTHON] 파이썬 CSV 오류 : 라인에 NULL 바이트가 들어 있습니다.

PYTHON

파이썬 CSV 오류 : 라인에 NULL 바이트가 들어 있습니다.

다음 코드를 사용하여 일부 CSV 파일로 작업하고 있습니다.

reader = csv.reader(open(filepath, "rU"))
try:
    for row in reader:
        print 'Row read successfully!', row
except csv.Error, e:
    sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e))

그리고 한 파일에서이 오류가 발생합니다.

file my.csv, line 1: line contains NULL byte

내가 무엇을 할 수 있을지? Google은 Excel 파일이 .csv로 부적절하게 저장되었다고 제안하는 것으로 보입니다. 파이썬에서이 문제를 해결할 수있는 방법이 있습니까?

== 업데이트 ==

아래 @ JohnMachin의 주석에 따라 스크립트에 다음 줄을 추가했습니다.

print repr(open(filepath, 'rb').read(200)) # dump 1st 200 bytes of file
data = open(filepath, 'rb').read()
print data.find('\x00')
print data.count('\x00')

그리고 이것은 내가 얻은 결과입니다 :

'\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1\x00\x00\x00\x00\x00\x00\x00\x00\ .... <snip>
8
13834

따라서 파일에는 실제로 NUL 바이트가 포함됩니다.

해결법

  1. ==============================

    1.@ S.Lott이 말했듯이 'rU'모드가 아니라 'rb'모드로 파일을 열어야합니다. 그러나 그것은 현재의 문제를 일으키지 않을 수도 있습니다. 내가 아는 한, 'rU'모드를 사용하면 데이터에 임베디드 된 \ r 있지만 다른 드라마는 발생하지 않는다. 또한 여러 파일 (모두 'rU'로 열었습니까?)이 있지만 문제가 발생한 파일은 하나뿐입니다.

    @ S.Lott이 말했듯이 'rU'모드가 아니라 'rb'모드로 파일을 열어야합니다. 그러나 그것은 현재의 문제를 일으키지 않을 수도 있습니다. 내가 아는 한, 'rU'모드를 사용하면 데이터에 임베디드 된 \ r 있지만 다른 드라마는 발생하지 않는다. 또한 여러 파일 (모두 'rU'로 열었습니까?)이 있지만 문제가 발생한 파일은 하나뿐입니다.

    csv 모듈에서 파일에 "NULL"(바보 같은 메시지, "NUL"이어야 함) 바이트가 있다고 표시하면 파일에있는 내용을 확인해야합니다. 'rb'를 사용하여 문제가 사라지더라도 이렇게하는 것이 좋습니다.

    repr ()은 디버깅 친구입니다 (또는되고 싶어합니다). 플랫폼 독립적 인 방식으로 당신이 가진 것을 모호하지 않게 나타낼 것입니다 (이것은 od가 무엇인지 알지 못하는 도우미에게 도움이됩니다). 이 작업을 수행:

    print repr(open('my.csv', 'rb').read(200)) # dump 1st 200 bytes of file
    

    신중하게 결과를 (주석이 아닌) 편집 한 내용으로 복사 / 붙여 넣기 (다시 입력하지 마십시오)하십시오.

    또한 파일이 실제로 dodgy 인 경우에도주의하십시오. \ r 또는 \ n 파일의 시작부터 적당한 거리 내에 있으면 reader.line_num에 의해보고 된 행 번호는 (도움이되지 않는) 1이됩니다. 첫 번째 \ x00이있는 경우

    data = open('my.csv', 'rb').read()
    print data.find('\x00')
    

    repr 또는 od로 최소한 그 이상의 바이트를 덤프해야합니다.

    data.count ( '\ x00')는 무엇을 말합니까? 많은 경우에는 다음과 같은 작업을 수행 할 수 있습니다.

    for i, c in enumerate(data):
        if c == '\x00':
            print i, repr(data[i-30:i]) + ' *NUL* ' + repr(data[i+1:i+31])
    

    따라서 문맥에서 NUL 바이트를 볼 수 있습니다.

    출력에서 \ x00 (또는 od -c 출력에서 ​​\ 0)을 볼 수 있으면 파일에 NUL 바이트가 있어야하며 다음과 같이해야합니다.

    fi = open('my.csv', 'rb')
    data = fi.read()
    fi.close()
    fo = open('mynew.csv', 'wb')
    fo.write(data.replace('\x00', ''))
    fo.close()
    

    그런데 텍스트 편집기를 사용하여 파일 (지난 몇 줄 포함)을 보았습니까? 실제로 다른 ( "NULL 바이트"예외가없는) 파일과 같은 합리적인 CSV 파일처럼 보이나요?

  2. ==============================

    2.UTF-16으로 읽는 것은 또한 내 문제였다.

    UTF-16으로 읽는 것은 또한 내 문제였다.

    다음은 작동하지 않는 코드입니다.

    f=codecs.open(location,"rb","utf-16")
    csvread=csv.reader(f,delimiter='\t')
    csvread.next()
    for row in csvread:
        print row
    

    여기서 location은 csv 파일의 디렉토리입니다.

  3. ==============================

    3.

    data_initial = open("staff.csv", "rb")
    data = csv.reader((line.replace('\0','') for line in data_initial), delimiter=",")
    

    이것은 나를 위해 작동합니다.

  4. ==============================

    4.나는이 문제에 또한 부딪쳤다. 파이썬 csv 모듈을 사용하여 MS Excel에서 생성 된 XLS 파일을 읽으려고하고 NULL 바이트 오류가 발생했습니다. 주위를 둘러 보았고 MS Excel 스프레드 시트 파일에서 데이터를 읽고 서식을 지정하기위한 xlrd Python 모듈을 찾았습니다. xlrd 모듈을 사용하면 파일을 제대로 읽을 수있을뿐만 아니라 전에는 할 수 없었던 방식으로 파일의 여러 부분에 액세스 할 수 있습니다.

    나는이 문제에 또한 부딪쳤다. 파이썬 csv 모듈을 사용하여 MS Excel에서 생성 된 XLS 파일을 읽으려고하고 NULL 바이트 오류가 발생했습니다. 주위를 둘러 보았고 MS Excel 스프레드 시트 파일에서 데이터를 읽고 서식을 지정하기위한 xlrd Python 모듈을 찾았습니다. xlrd 모듈을 사용하면 파일을 제대로 읽을 수있을뿐만 아니라 전에는 할 수 없었던 방식으로 파일의 여러 부분에 액세스 할 수 있습니다.

    너를 도울 것 같아서.

  5. ==============================

    5.소스 파일의 인코딩을 UTF-16에서 UTF-8로 변환하면 문제가 해결됩니다.

    소스 파일의 인코딩을 UTF-16에서 UTF-8로 변환하면 문제가 해결됩니다.

    파이썬에서 utf-8로 파일을 변환하는 방법?

    import codecs
    BLOCKSIZE = 1048576 # or some other, desired size in bytes
    with codecs.open(sourceFileName, "r", "utf-16") as sourceFile:
        with codecs.open(targetFileName, "w", "utf-8") as targetFile:
            while True:
                contents = sourceFile.read(BLOCKSIZE)
                if not contents:
                    break
                targetFile.write(contents)
    
  6. ==============================

    6.존재하지 않는 척하려는 경우 null 값을 필터링하기 위해 생성기를 인라인 할 수 있습니다. 물론 이것은 null 바이트가 실제로 인코딩의 일부가 아니며 실수로 어떤 종류의 잘못된 인공물 또는 버그라고 가정합니다.

    존재하지 않는 척하려는 경우 null 값을 필터링하기 위해 생성기를 인라인 할 수 있습니다. 물론 이것은 null 바이트가 실제로 인코딩의 일부가 아니며 실수로 어떤 종류의 잘못된 인공물 또는 버그라고 가정합니다.

    with open(filepath, "rb") as f:
        reader = csv.reader( (line.replace('\0','') for line in f) )
    
        try:
            for row in reader:
                print 'Row read successfully!', row
        except csv.Error, e:
            sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e))
    
  7. ==============================

    7.왜 이런 짓을하는?

    왜 이런 짓을하는?

     reader = csv.reader(open(filepath, "rU"))
    

    문서는 꽤 명확해야합니다.

    with open(filepath, "rb") as src:
        reader= csv.reader( src )
    

    읽을 모드는 "rb"여야합니다.

    http://docs.python.org/library/csv.html#csv.reader

  8. ==============================

    8.아마 XLS 파일이고 http://www.garykessler.net/library/file_sigs.html로 CSV 파일이 아닙니다.

    아마 XLS 파일이고 http://www.garykessler.net/library/file_sigs.html로 CSV 파일이 아닙니다.

  9. ==============================

    9.csv reader 대신에 나는 파일을 읽고 string을 위해 split 함수를 사용합니다 :

    csv reader 대신에 나는 파일을 읽고 string을 위해 split 함수를 사용합니다 :

    lines = open(input_file,'rb') 
    
    for line_all in lines:
    
        line=line_all.replace('\x00', '').split(";")
    
  10. ==============================

    10.나는 똑같은 오류가있다. 파일을 UTF-8로 저장하면 효과적입니다.

    나는 똑같은 오류가있다. 파일을 UTF-8로 저장하면 효과적입니다.

  11. ==============================

    11.OpenOffice Calc로 CSV 파일을 만들 때 이런 일이 일어났습니다. 나중에 텍스트 편집기에서 CSV 파일을 만들었는데, 나중에 Calc로 편집하더라도 마찬가지입니다.

    OpenOffice Calc로 CSV 파일을 만들 때 이런 일이 일어났습니다. 나중에 텍스트 편집기에서 CSV 파일을 만들었는데, 나중에 Calc로 편집하더라도 마찬가지입니다.

    내 텍스트 편집기에서 내 Calc로 만든 파일의 데이터를 새로운 편집기로 만든 파일에 복사하여 붙여 넣어 문제를 해결했습니다.

  12. ==============================

    12.빈 헤더에 NULL 바이트를 삽입 한 웹 서비스에서 생성 된 CSV를 여는 데 동일한 문제가있었습니다. 파일을 지우려면 다음을 수행하십시오.

    빈 헤더에 NULL 바이트를 삽입 한 웹 서비스에서 생성 된 CSV를 여는 데 동일한 문제가있었습니다. 파일을 지우려면 다음을 수행하십시오.

    with codecs.open ('my.csv', 'rb', 'utf-8') as myfile:
        data = myfile.read()
        # clean file first if dirty
        if data.count( '\x00' ):
            print 'Cleaning...'
            with codecs.open('my.csv.tmp', 'w', 'utf-8') as of:
                for line in data:
                    of.write(line.replace('\x00', ''))
    
            shutil.move( 'my.csv.tmp', 'my.csv' )
    
    with codecs.open ('my.csv', 'rb', 'utf-8') as myfile:
        myreader = csv.reader(myfile, delimiter=',')
        # Continue with your business logic here...
    

    부인 성명: 이렇게하면 원래 데이터를 덮어 쓰게됩니다. 백업 복사본이 있는지 확인하십시오. 너는 경고 당했다!

  13. ==============================

    13.그 모든 'rU'파일 모드에 대한 싫어하는 사람을 위해 : 나는 방금 'rb'파일 모드로 Mac의 Windows 컴퓨터에서 CSV 파일을 열려고 시도했으며 CSV 모듈에서이 오류가 발생했습니다.

    그 모든 'rU'파일 모드에 대한 싫어하는 사람을 위해 : 나는 방금 'rb'파일 모드로 Mac의 Windows 컴퓨터에서 CSV 파일을 열려고 시도했으며 CSV 모듈에서이 오류가 발생했습니다.

    Error: new-line character seen in unquoted field - do you need to 
    open the file in universal-newline mode?
    

    'rU'모드에서 파일을 열면 정상적으로 작동합니다. 유니버설 - 개행자 모드를 좋아합니다 - 저에게 많은 번거 로움을 덜어줍니다.

  14. ==============================

    14.scrapy를 사용하고 zip 형식의 csvfile을 가져올 때 올바른 미들웨어를 사용하지 않고 응답 본문을 압축 해제하여 csvreader에 전달할 때이 문제가 발생했습니다. 따라서 파일은 실제로는 csv 파일이 아니며 줄 바꿈에 따라 NULL 바이트 오류가 발생합니다.

    scrapy를 사용하고 zip 형식의 csvfile을 가져올 때 올바른 미들웨어를 사용하지 않고 응답 본문을 압축 해제하여 csvreader에 전달할 때이 문제가 발생했습니다. 따라서 파일은 실제로는 csv 파일이 아니며 줄 바꿈에 따라 NULL 바이트 오류가 발생합니다.

  15. ==============================

    15.gzip.open을 사용해 보셨습니까?

    gzip.open을 사용해 보셨습니까?

    with gzip.open('my.csv', 'rb') as data_file:
    

    압축 된 파일을 열려고했지만 'csv.gz'대신 '.csv'확장자를 사용했습니다. 이 오류는 gzip.open을 사용하기 전까지 계속 나타났습니다.

  16. ==============================

    16.한 가지 경우입니다 - CSV 파일에 빈 행이 있으면이 오류가 표시 될 수 있습니다. 우리가 쓰기 또는 읽기를 진행하기 전에 행을 확인해야합니다.

    한 가지 경우입니다 - CSV 파일에 빈 행이 있으면이 오류가 표시 될 수 있습니다. 우리가 쓰기 또는 읽기를 진행하기 전에 행을 확인해야합니다.

    for row in csvreader:
            if (row):       
                do something
    

    코드에이 체크를 추가하여 문제를 해결했습니다.

  17. from https://stackoverflow.com/questions/4166070/python-csv-error-line-contains-null-byte by cc-by-sa and MIT license