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은 .csv로 잘못 저장된 Excel 파일일 수 있다고 제안하는 것 같습니다.파이썬에서 이 문제를 해결할 수 있는 방법이 있습니까?
업데이트 ==
아래 @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 바이트가 포함되어 있습니다.
@S.Lott가 말했듯이, 당신은 당신의 파일을 'rU' 모드가 아닌 'rb' 모드로 열어야 합니다.그러나 현재 문제가 발생하지 않을 수 있습니다.로는 '하면 내장된 내가알 'rU'가 엉망이 될 것 .\r
데이터에서, 그러나 다른 드라마를 유발하지는 않습니다.또한 여러 개의 파일(모두 'rU'?로 열림)이 있지만 하나만 문제가 발생하고 있습니다.
csv 모듈에서 파일에 "NULL"(사일리 메시지, "NUL"이어야 함) 바이트가 있다고 표시되면 파일에 무엇이 있는지 확인해야 합니다.'rb'를 사용하면 문제가 없어지더라도 이렇게 하는 것이 좋습니다.
repr()
디버깅 친구입니다.인 방식으로 입니다. (을 모르는 .)od
do), is or do).수행할 작업:
print repr(open('my.csv', 'rb').read(200)) # dump 1st 200 bytes of file
그리고 결과를 주의 깊게 복사/복사(다시 입력하지 않음)하여 질문 편집(댓글이 아님)합니다.
또는 는 \r \n\n은 파일의 시작점에서 적절한 거리 내에 .reader.line_num
(도움이 되지 않는) 1이 될 것입니다. 번째 첫번위찾기치가 있는 곳 \x00
하는 것에 의해 (있는 경우)
data = open('my.csv', 'rb').read()
print data.find('\x00')
최소한 그 만큼의 바이트를 보고서와 함께 덤프해야 합니다.
가 입니까?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
(또는 또출는력▁\0
의 신의에od -c
출력), 그러면 파일에 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 파일처럼 보이나요?
data_initial = open("staff.csv", "rb")
data = csv.reader((line.replace('\0','') for line in data_initial), delimiter=",")
이것은 나에게 효과가 있습니다.
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 파일의 디렉토리입니다.
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))
저도 이 문제에 부딪혔습니다.Python csv
는 MS "", "MS Excel", "XLS"에 .NULL byte
오류가 발생했습니다.둘러보니 MS Excel 스프레드시트 파일의 데이터를 읽고 포맷하기 위한 xlrd Python 모듈이 있었습니다.와 함께xlrd
모듈, 저는 파일을 제대로 읽을 수 있을 뿐만 아니라, 이전에는 볼 수 없었던 방식으로 파일의 많은 다른 부분에 액세스할 수 있습니다.
도움이 될 것 같아서요
소스 파일의 인코딩을 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)
넌 이걸 왜 하는 거니?
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
csv 파일이 파일 개체인 경우 차이가 있는 플랫폼에서 'b' 플래그를 사용하여 열어야 합니다.
http://www.garykessler.net/library/file_sigs.html 에서 확인한 대로 CSV 파일이 아니라 XLS 파일인 것 같습니다.
CSV 판독기 대신 문자열에 대해 읽기 파일 및 분할 기능을 사용합니다.
lines = open(input_file,'rb')
for line_all in lines:
line=line_all.replace('\x00', '').split(";")
저도 같은 오류가 발생했습니다.UTF-8에 파일을 저장하고 작동했습니다.
OpenOffice Calc로 CSV 파일을 만들 때 이런 일이 발생했습니다.나중에 Calc로 편집해도 텍스트 편집기에 CSV 파일을 만들 때는 그렇지 않았습니다.
텍스트 편집기에 Calc에서 만든 파일의 데이터를 새 편집기에서 복사하여 붙여넣음으로써 문제를 해결했습니다.
빈 헤더에 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...
고지 사항:이렇게 하면 원래 데이터가 덮어쓰게 됩니다.백업본이 있는지 확인합니다.경고를 받았습니다!
원본 csv 파일을 열어 저장했습니다..csv
파일을 Excel의 "다른 이름으로 저장"을 통해 저장하고 NULL 바이트가 사라졌습니다.
제가 받은 파일의 원래 인코딩은 2바이트 유니코드(다른 문자마다 null 문자가 있음)였던 것 같아 엑셀을 통해 저장하면 인코딩이 수정되었습니다.
모든 'rU' 파일 모드 혐오자의 경우:방금 'rb' 파일 모드를 사용하는 Mac의 윈도우즈 시스템에서 CSV 파일을 열려고 시도했는데 CSV 모듈에서 다음 오류가 발생했습니다.
Error: new-line character seen in unquoted field - do you need to
open the file in universal-newline mode?
파일을 'rU' 모드에서 열면 정상적으로 작동합니다.저는 유니버설-뉴라인 모드를 좋아합니다. 번거로움을 덜어줍니다.
응답 본문을 CSV 판독기에 넘겨주기 전에 압축을 풀 수 있는 올바른 미들웨어가 없는 상태에서 스크래피를 사용하고 압축된 csv 파일을 가져올 때 이 문제가 발생했습니다.따라서 파일은 실제로 csv 파일이 아니었고 다음을 던졌습니다.line contains NULL byte
오류가 발생합니다.
gzip.open을 사용해 본 적이 있습니까?
with gzip.open('my.csv', 'rb') as data_file:
압축되었지만 'csv.gz'가 아닌 '.csv' 확장자를 가진 파일을 열려고 했습니다.이 오류는 gzip.open을 사용할 때까지 계속 나타납니다.
제게 효과가 있었던 것은 특정 인물을 블랙리스트에 올리는 보다 수동적인 접근법을 취하는 것입니다.제가 작업하던 데이터에서 ASCII 제어 문자가 행이 손상되었음을 나타냈습니다.이 스크립트는 "잘못된" 문자를 찾고, 발견되면 행을 완전히 건너뜁니다.그러나 첫 번째 행의 CSV 헤더가 손상되지 않았다고 가정합니다.이 접근 방식을 사용하면 손상된 데이터가 다음에 도달하기 전에 가로채게 됩니다.csv.DictReader
그러면 null 바이트 오류가 발생합니다.
import io, csv
# Problematic ASCII control characters.
ascii_control_characters = list(range(0, 31))
ascii_control_characters.append(127) # Delete.
ascii_control_characters.remove(10) # Line feed.
ascii_control_characters.remove(13) # Carriage return.
with open('/foo/bar/baz.csv', 'r') as data_file:
header = ''
for index, line in enumerate(data_file):
# Search line for problematic ASCII characters.
bad_character_found = False
for character in line:
if ord(character) in ascii_control_characters:
bad_character_found = True
break
# If a bad character is found, skip the line altogether.
if bad_character_found:
print(
'Corrupted data found on line: ' + \
str(index + 1) + \
'. Skipping...'
)
continue
if index == 0:
header += line
continue
csv_data = header + line
reader = csv.DictReader(io.StringIO(csv_data))
for row in reader:
# Process each CSV row here.
pass
한 가지 경우 - CSV 파일에 빈 행이 포함된 경우 이 오류가 나타날 수 있습니다.쓰기 또는 읽기를 진행하기 전에 행을 확인해야 합니다.
for row in csvreader:
if (row):
do something
코드에 이 체크를 추가하여 문제를 해결했습니다.
언급URL : https://stackoverflow.com/questions/4166070/python-csv-error-line-contains-null-byte
'programing' 카테고리의 다른 글
ngSubmit은 페이지를 Angular 2 형식으로 새로 고칩니다. (0) | 2023.08.15 |
---|---|
테이블을 가로질러 결합할 때 객체의 인덱스/분해를 최적화하는 방법은 무엇입니까? (0) | 2023.08.15 |
앱 실행기 아이콘에서 알림 수를 표시하는 방법 (0) | 2023.08.15 |
매개 변수를 사용하여 mySql에서 프로시저 만들기 (0) | 2023.08.15 |
Excel 시트를 열지 않고 계산(openpyxl 또는 xlwt) (0) | 2023.08.15 |