2012-05-09 3 views
3

파이썬 3.2에서 bzip2 압축 CSV 파일을 읽으려고합니다. 압축되지 않은 CSV 파일의 경우,이 작품 :바이너리 입력 스트림을 텍스트 모드로 변환

datafile = open('./file.csv', mode='rt') 
data = csv.reader(datafile) 
for e in data: # works 
    process(e) 

문제는 BZ2File는 이진 스트림을 만들어 지원하고, 파이썬 3, csv.reader accepts only text streams에. (동일한 문제가 GZIP과 ZIP 파일을 발생한다.) 특히

datafile = bz2.BZ2File('./file.csv.bz2', mode='r') 
data = csv.reader(datafile) 
for e in data: # error 
    process(e) 

는 표시된 라인은 예외 _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)을 던진다.

나는 또한 data = csv.reader(codecs.EncodedFile(datafile, 'utf8'))을 시도했지만 오류를 수정하지 않습니다.

어떻게 이진 입력 스트림을 텍스트 모드로 사용할 수 있도록 래핑 할 수 있습니까 ??

답변

5

이 나를 위해 작동합니다

import codecs, csv 
f = codecs.open("file.csv", "r", "utf-8") 
g = csv.reader(f) 
for e in g: 
    print(e) 

을 BZ2의 경우 :

import codecs, csv, bz2 
f = bz2.BZ2File("./file.csv.bz2", mode="r") 
c = codecs.iterdecode(f, "utf-8") 
g = csv.reader(c) 
for e in g: 
    print(e) 
+1

그리고 정확히 어떻게 당신이 BZ2 압축 파일이 사용에 대한 의도 했습니까? –

+1

수정 됨, 감사합니다. – vz0

+0

@ vz0 : 검사 할 마지막 세부 사항은 개행의 해석이 예상대로 작동하는지 (해석이없는 경우)입니다. 즉, 개행 문자가 인용 된 값 안에 포함될 수 있으면 압축되지 않은 CSV는'open (fname, 'r', newlines = '')를 사용합니다. 가능성이 높습니다. 올바르게 작동합니다. 너 시도 할 수있어? – pepr

관련 문제