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


84

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")

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


"상판"? 그게 무슨 뜻입니까? 어떤 오류가 발생합니까? 귀하의 의견은 무엇입니까?

입력은 pyqt4 QTableWidgetItem입니다. 문제는 스크립트가 플러그인으로 실행되기 때문에 오류가 발생하지 않는다는 것입니다.
— Martin

그런 다음 QT 외부에서 문제를 재현 해보십시오.

해결책을 찾았습니다. 나는 써야했다myfile.write(u"%s"&f+";")
— 마틴

답변:


106

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

pip2 install unicodecsv

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


29
그냥 가져 오기를 대체하여, 나는 또한 작가를 만들 때 인코딩을 추가했다 작동하지 않았다 writer = csv.writer(out, dialect='excel', encoding='utf-8'), 그리고으로 파일 핸들러를 작성 open(..., 없습니다 codecs.open(... .
— Suzana

4
StackOverflow에 대한 모든 제안을 시도했지만이 제안 만 저에게 효과적입니다.
— 찰스 차우

95

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의 경우 여기를보십시오 .


1
콘텐츠 writerow가 utf-8이 아니면 어떻게됩니까? 작동할까요?
— CKM

1
타사 pip 설치가 필요하지 않습니다.
— 하기 Vaibhav 이씨


4

나를 위해 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함수 를 추가 할 수도 있습니다 . 연습은 독자에게 맡겨집니다.


py2.x에 대한 훨씬 더 간단한 솔루션은 여전히 ​​사용하고있는 사람들을 위해.
— 칸

2

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

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


1
링크 주셔서 감사합니다. 도움이되었습니다. 내 지식으로 링크를 게시 했더라도 여기에 코드를 복사 할 수 없습니까? (저작권 소유자의 경우 +1)
— Mutant

1
@Mutant : 코드는 과학 논문과 다릅니다. 코드는 저작권으로 보호됩니다. 나는 99.999 %의 파이썬 소유자가 코드 복사에 대해 고소하지 않을 것이라고 확신하지만, 허용 여부를 알아보기 위해 긴 라이센스 를 읽고 싶지 않았습니다. ! 또한,의 좋은는 그 = :-) "나는 그것으로 원하는 건 뭐든지 할 수있다" "나는 내 모니터에서 볼 수 있습니다"가끔 사람들을 생각 나게합니다
— 아론 Digulla

1
알림 주셔서 감사합니다. 불행히도 우리가 살고있는 세상은 상상할 수있는 것보다 빠르게 정보가 흐르고있는 곳에서 너무나 (비합리적으로) 부주의하게되었습니다. 감사합니다 :)
— Mutant

2
문서 링크는 약간 유용하지만 (예가 더 낫습니다) 여기에서 "저작권"주장은 과장되고 무례합니다. Python은 명시 적으로 오픈 소스입니다 ( v2 v3 ). 라이센스는 명확합니다. "복제, 분석, 테스트, 수행 및 / 또는 공개적으로 표시하고, 파생 작업을 준비하고, 배포 할 수있는 로열티가없는 전 세계 라이센스 ... [등 등]" 페이지 상단의 "GPL 호환"은 편안함을 제공해야합니다. 오픈 소스를 공유하세요. 원하는 경우 수정하십시오. 이유가있는 오픈 소스입니다.
— alttag

@alttag 프로젝트에서 GPLd 코드를 복사하거나 사용한다는 것은 동일한 프로젝트의 다른 모든 코드도 이제 GPL 아래에 있음을 의미합니다. 저는 저작권 변호사가 아니기 때문에 웹 사이트에 게시 된 코드와 관련하여 그것이 의미하는 바를 모릅니다.
— Aaron Digulla 2017

0

들어 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)
    인코딩 된 행 반환

-1

매우 간단한 해킹은 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에 견고 해 보입니다. *

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.