2014-01-15 4 views
2

csv 파일에 utf-8 문자를 쓰는 방법은 무엇입니까?utf-8 형식의 파이썬 목록을 CSV로 작성

내 데이터와 코드 :

# -*- coding: utf-8 -*- 

l1 = ["žžž", "ččč"] 
l2 = ["žžž", "ččč"] 

thelist = [l1, l2] 

import csv 
import codecs 

with codecs.open('test', 'w', "utf-8-sig") as f: 
    writer = csv.writer(f) 
    for x in thelist: 
     print x 
     for mem in x: 
      writer.writerow(mem) 

오류 메시지 :

Traceback (most recent call last): 
    File "2010rudeni priimti.py", line 263, in <module> 
writer.writerow(mem) 
File "C:\Python27\lib\codecs.py", line 691, in write 
return self.writer.write(data) 
File "C:\Python27\lib\codecs.py", line 351, in write 
data, consumed = self.encode(object, self.errors) 
File "C:\Python27\lib\encodings\utf_8_sig.py", line 82, in encode 
return encode(input, errors) 
File "C:\Python27\lib\encodings\utf_8_sig.py", line 15, in encode 
return (codecs.BOM_UTF8 + codecs.utf_8_encode(input, errors)[0], len(input)) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 11: ordinal not in range(128) 

을 눌러 계속하려면 아무 키나. . .

내 실수는 무엇입니까?

+0

부수적으로, 소스 코드에 인코딩을 지정하지 않았습니다. 즉, 파이썬이이를 라틴어 -1로 해석 할 것입니다 (아마도 경고와 함께 해석 할 것입니다. 그러나 당신은 그것을 보지 않거나 무시하고있는 것 같습니다) it?) ...하지만 라틴어 -1에는'ž' 문자가 없기 때문에 분명히 다른 것으로 편집하고 있습니다. 따라서 현재 문제를 해결하더라도 mojibake를 파일에 작성하려고합니다. 예를 들어 UTF-8 편집기를 사용하는 경우 첫 번째 문자열은'žžž '로 끝납니다. – abarnert

+0

''CHARSET = "$ (파일 -bi"$ i "| awk -F"= " '{인쇄 $ 2}')" [ "$ CHARSET"! = utf-8]; then iconv -f "$ CHARSET"-t utf8 "$ i"-o outfile fi' – Vor

답변

5

2.x의 csv 모듈은 유니 코드를 읽거나 쓰지 않지만 바이트를 읽거나 씁니다 (ASCII 호환 가능하다고 가정하지만 UTF-8에는 문제가 없습니다).

따라서, codecs 유니 코드 파일에 쓸 경우 unicode 대신 str이 전달됩니다. 그리고 codecsencode으로 UTF-8로 변환하려고 시도하면 처음에는 decode이 유니 코드로 변환되어야합니다.이 유니 코드는 기본 인코딩 인 ASCII를 사용하므로 실패합니다. 따라서이 오류 :이 솔루션은 당신을 위해 모든 것을 돌봐 Examples에서 래퍼로, 워드 프로세서에 설명되어

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 11: ordinal not in range(128) 

. 파일을 사용하는 대신 일반 이진 파일에 UnicodeWriter을 사용하십시오. 대안으로


unicodecsv처럼 unicode 대신 str에서 직접 거래하는 csv 모듈을 마무리 PyPI에 몇 가지 다른 패키지가있다.

더 급진적 인 대안으로, Python 3.x의 csv 모듈에는 처음에는이 문제가없고 (3.x도 다음 문제가 없음).

많은 해커 대안은 전 세계가 UTF-8 인 것처럼 가장하는 것입니다. 결국, 소스 코드와 출력물 모두는 UTF-8이 될 것이며, csv 모듈은 ASCII 호환이 가능한 소수의 문자 (줄 바꿈, 쉼표, 어쩌면 따옴표 및 백 슬래시)를 신경 쓰지 않습니다. 따라서 디코딩과 인코딩을 건너 뛰고 모든 것이 작동합니다. 확실한면은 디버깅 할 때 오류가 발생하는 대신 오류가 발생하면 가비지로 가득 찬 파일을 얻을 수 있다는 것입니다.


(파이썬 3가 처음 문제를 해결할 수 있지만) UnicodeWriter 또는 unicodecsv 마술 해결할 수도있는 코드와 다른 두 가지 문제가 있습니다.

먼저 을 입력하면의 첫 번째 자리에 csv 유니 코드가 제공됩니다. 원본 데이터의 열은 보통 str 리터럴 (예 : "žžž")입니다. UTF-8로 인코딩 할 수 없으며, 오히려 가능하면 자동으로 ascii로 디코딩하면 다시 같은 오류가 발생합니다. 이 문제를 피하려면 u"žžž"과 같은 유니 코드 리터럴을 사용하십시오 (원한다면 명시 적으로 소스 인코딩에서 decode ...하지만 어리석은 일입니다).

둘째, 소스에 encoding declaration을 지정하지 않았지만 비 ASCII 문자를 사용했습니다.기술적으로 이것은 Python 2.7에서는 불법입니다. 실제적으로, 나는 당신에게 경고를 주었지만 근원을 Latin-1로 취급한다고 확신합니다. 어떤 문자가 없기 때문에 Latin-1 편집기를 사용하고 있지 않으므로 (어느 문자도 라틴 -1 텍스트 파일에 넣을 수 없습니다.) ž을 사용할 수 없습니다. 파일을 UTF-8로 저장 한 다음 Python에 Latin-1로 해석하도록 지시하면 žžž 대신에 žžž으로 끝나고 유사한 mojibake로 끝납니다.

+0

@abamert, 코드를 시도했지만 작동하지 않았습니다. https://stackoverflow.com/questions/49121728/write-utf-8-through-python-csv-prev-answer-not-working을 보시라도 괜찮다면 꼭 의견을 보내 주시면 감사하겠습니다. – WesR

관련 문제