2010-12-02 4 views
1

Im은 Python2.x에서 다음을 사용합니다.csv module python3.1

import csv 
f = open('test.csv', 'wb') 
writer = csv.writer(f) 
writer.writerow((fpath, md5sum, size)) # <str>, <str>, <int> 

아무 문제없이 작동합니다. 그러나 이것을 Python3에서 실행하면 TypeError가 발생합니다.

writer.writerow((fpath, md5sum, size)) 
TypeError: write() argument 1 must be bytes or buffer, not str 
트릭을 할 것입니다 비 바이너리 모드로 열려있는 파일에 데이터를 작성하는 물론

,하지만 난 유니 코드 Py3에서 처리되는 방식을 좋아하고 특히 파일에 쓰기 전에 데이터를 인코딩 할 그것에서 읽을 때 그것을 해독하십시오.

어떻게이 문제를 해결할 수 있습니까?

+0

정확히 어떻게 데이터를 디코딩/인코딩하고 있고 바이너리 모드와 관련이 있습니까? – SilentGhost

+0

유니 코드/바이트 분할의 요점은 인코딩/디코딩 자체를 다루지 않아도된다는 것입니다. 기본값에서 다른 코덱을 사용하려면 Ignacio의 대답을 참조하십시오. –

+0

"자신의 인코딩을 처리하지 않아도된다는"요점을 설명해 주시겠습니까? 유니 코드/바이트 분할은이 작업과 어떤 관련이 있습니까? –

답변

6
f = open('test.csv', 'w', encoding='utf-8', newline='') 
+1

이 답변은 비 Windows 시스템에서 정상입니다. 이식성을 위해 모든 3.X csv 파일은 읽기 또는 쓰기 여부에 상관없이'newline = '' '으로 열어야합니다. 글쓰기 사례는 아직 문서화되어 있지 않습니다. 버그 보고서 제기 ... http://bugs.python.org/issue7198 –

+0

문서가 수정되었습니다 - 감사합니다, @ JohnMachin! –