[python] CSV 파일에 UTF-8을 쓰는 방법

PyQt4에서 csv 형식의 텍스트 파일을 만들려고합니다 QTableWidget. 특수 문자가 포함되어 있으므로 UTF-8 인코딩으로 텍스트를 작성하고 싶습니다. 다음 코드를 사용합니다.

import codecs
...
myfile = codecs.open(filename, 'w','utf-8')
...
f = result.table.item(i,c).text()
myfile.write(f+";")

셀에 특수 문자가 포함될 때까지 작동합니다. 나는 또한 시도했다

myfile = open(filename, 'w')
...
f = unicode(result.table.item(i,c).text(), "utf-8")

그러나 특수 문자가 나타나면 중지됩니다. 나는 내가 뭘 잘못하고 있는지 전혀 모른다.



답변

쉘에서 다음을 실행하십시오.

pip2 install unicodecsv

그리고 (원래의 질문과는 달리) 파이썬의 내장 사용하고있는 추정 csv모듈, 턴
import csv으로
import unicodecsv as csv코드에서.


답변

Python 3.x ( docs ) 에서는 매우 간단합니다 .

import csv

with open('output_file_name', 'w', newline='', encoding='utf-8') as csv_file:
    writer = csv.writer(csv_file, delimiter=';')
    writer.writerow('my_utf8_string')

Python 2.x의 경우 여기를보십시오 .


답변

이 패키지를 사용하면 작동합니다 : https://github.com/jdunck/python-unicodecsv .


답변

나를 위해 UnicodeWriterPython 2 CSV 모듈 문서 의 클래스는 csv.writer.write_row()인터페이스를 깨뜨리기 때문에 실제로 작동하지 않았습니다 .

예를 들면 :

csv_writer = csv.writer(csv_file)
row = ['The meaning', 42]
csv_writer.writerow(row)

작동하는 동안 :

csv_writer = UnicodeWriter(csv_file)
row = ['The meaning', 42]
csv_writer.writerow(row)

던질 것 AttributeError: 'int' object has no attribute 'encode'입니다.

UnicodeWriter모든 열 값이 문자열이 될 것으로 예상 했듯이 값을 직접 변환하고 기본 CSV 모듈을 사용할 수 있습니다.

def to_utf8(lst):
    return [unicode(elem).encode('utf-8') for elem in lst]

...
csv_writer.writerow(to_utf8(row))

또는 원숭이 패치 csv_writer로 write_utf8_row함수 를 추가 할 수도 있습니다 . 연습은 독자에게 맡겨집니다.


답변

Python 문서의 예제는 유니 코드 CSV 파일 작성 방법을 보여줍니다. http://docs.python.org/2/library/csv.html#examples

(저작권으로 보호되기 때문에 여기에서 코드를 복사 할 수 없습니다.)


답변

들어 python2 전에이 코드를 사용하여 csv_writer.writerows(rows)

이 코드는 UTF-8 문자열을 정수로 변환되지 않습니다

def encode_rows_to_utf8 (행) :
    encode_rows = []
    행의 행 :
        encode_row = []
        행 값 :
            인스턴스 (값, 기본 문자열) 인 경우 :
                값 = unicode (값) .encode ( "utf-8")
            encode_row.append (값)
        encoding_rows.append (encoded_row)
    인코딩 된 행 반환


답변

매우 간단한 해킹은 csv 대신 json 가져 오기를 사용하는 것입니다. 예를 들어 csv.writer 대신 다음을 수행하십시오.

    fd = codecs.open(tempfilename, 'wb', 'utf-8')
    for c in whatever :
        fd.write( json.dumps(c) [1:-1] )   # json dumps writes ["a",..]
        fd.write('\n')
    fd.close()

기본적으로 올바른 순서의 필드 목록이 주어지면 json 형식의 문자열은 각각 시작과 끝의 [및]를 제외하고 csv 행과 동일합니다. 그리고 json은 python 2에서 utf-8에 견고 해 보입니다. *