2016-08-04 3 views
1

을 인용 내가 기대하는이 코드는 무엇을 :파이썬 3 csv.writer 접두사 인쇄 "바이트"와 파이썬 2에서

import csv 
import sys 

writer = csv.writer(sys.stdout) 
writer.writerow([u'hello', b'world']) 

그것은 인쇄 :

hello,world 

을하지만 파이썬 3에서, bytes는 접두사로 인쇄 인용됩니다

hello,b'world' 

CSV는 일반 데이터 교환 형식이며, 다른 어떤 시스템 이후부터 파이썬은 무엇보다 b''이 무엇인지 알고 있기 때문에이 동작을 비활성화해야합니다. 그러나 나는 방법을 알아 내지 못했다.

처음에는 모든 bytesstr.decode을 사용할 수 있지만 불편하고 비효율적입니다. 정말 원하는 것은 리터럴 바이트를 파일에 쓰거나 인코딩 (예 : 'ascii')을 csv.writer()으로 전달하여 어떤 bytes 객체를 디코딩하는 방법을 알고 있기 때문입니다.

답변

0

파이썬 3에서 csv 모듈을 사용하여 바이트 문자열을 명시 적으로 유니 코드 문자열로 변환하지 않아도되는 것을 피할 방법이 없다고 생각합니다. 파이썬 2에서는 암시 적으로 ASCII로 변환됩니다.

이 작업을보다 쉽게 ​​수행하려면 아래와 같이 csv.writer (또는 랩핑) 객체를 효과적으로 서브 클래 싱하여 프로세스를보다 편리하게 만들 수 있습니다.

import csv 

class MyCsvWriter(object): 
    def __init__(self, *args, **kwrds): 
     self.csv_writer = csv.writer(*args, **kwrds) 

    def __getattr__(self, name): 
     return getattr(self.csv_writer, name) 

    def writerow(self, row): 
     self.csv_writer.writerow(
      str(v, encoding='utf-8') if isinstance(v, bytes) else v for v in row) 

    def writerows(self, rows): 
     for row in rows: 
      self.writerow(row) 

with open('bytes_test.csv', 'w', newline='') as file: 
    writer = MyCsvWriter(file) 
    writer.writerow([u'hello', b'world']) 
+0

바이트 문자열과 유니 코드 문자열은 파이썬 2에서도 두 가지 유형이 있습니다. 파이썬 2는 기본 'ascii'코덱을 사용하여 암시 적 변환을 허용합니다. –

+0

@Mark : 감사합니다 ... 그에 따라 업데이트 된 답변. – martineau

0

csv 텍스트 파일을 작성 및 Python 유니 코드 (텍스트) 문자열 3.

csv 이진 파일을 기록 및 Python 2 바이트의 문자열을 기대 기대되지만를 사용 바이트 문자열 유니 코드 문자열 암시 인코딩을 허용 기본값은 ascii 코덱입니다. 파이썬 3은 암시 적 변환을 허용하지 않으므로이를 피할 수는 없습니다.

#!python3 
import csv 
import sys 
writer = csv.writer(sys.stdout) 
writer.writerow(['hello', b'world'.decode()])