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.