CSVファイルにUTF-8を書き込む方法


83

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

ただし、特殊文字が表示されると停止します。何が間違っているのかわかりません。


「それもトップス」?どういう意味ですか?どのようなエラーが発生しますか?あなたの意見は何ですか?

入力はpyqt4QTableWidgetItemです。問題は、スクリプトがプラグインとして実行されているため、エラーが発生しないことです。
マーティン

次に、QTの外部で問題を再現してみてください。

解決策を見つけました。私は書かなければなりませんでしたmyfile.write(u"%s"&f+";")
マーティン

回答:


106

シェル実行から:

pip2 install unicodecsv

そして(元の質問とは異なり)Pythonの組み込みcsvモジュールを使用していると仮定
import csv
import unicodecsv as csvて、コードに変換します。


29
インポートを置き換えるだけでは機能しませんでした。ライターを作成するときにエンコーディングを追加する必要がありました:writer = csv.writer(out, dialect='excel', encoding='utf-8')、ファイルハンドラーをopen(...はなくで 作成しましたcodecs.open(...
スザナ

4
StackOverflowですべての提案を試しましたが、これだけが機能します。
Charles Chow

90

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
toのコンテンツがwriterowutf-8でない場合はどうなりますか?それは機能しますか?
CKM

1
サードパーティのpipをインストールする必要はありません。
VaibhavVishal19年


3

私にとって、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関数を追加することもできます。演習は読者に任されています。


2

Pythonドキュメントの例は、Unicode CSVファイルの記述方法を示しています:http//docs.python.org/2/library/csv.html#examples

(著作権で保護されているため、ここにコードをコピーすることはできません)


1
リンクをありがとう。役に立ちました。私の知る限り、リンクを投稿したとしても、ここにコードをコピーして貼り付けることはできませんか?(著作権を所有するための+1)
ミュータント

1
@Mutant:コードは科学論文のようなものではありません。コードは著作権で保護されています。Pythonの所有者がコードをコピーしたことでSOを訴えることはないと99.999%確信していますが、長いライセンスを読んで許可されているかどうかを確認する気にはなりませんでした。また、
時々人々に

1
念押し有難う。残念ながら、私たちが住んでいる世界は、情報が想像以上に速く流れている場所で、(不当に)速く不注意になりました。重要な制限については、何度も思い出させる必要があります。それをありがとう:)
ミュータント

2
ドキュメントのリンクは半有用ですが(例の方が優れています)、ここでの「著作権」の議論は誇張されており、不吉です。Pythonは明示的にオープンソースです(v2 v3)。ライセンスは明確です。「複製、分析、テスト、実行、および/または公開、派生物の作成、配布などを行うためのロイヤリティフリーの世界規模のライセンス... [など]」ページの上部にある「GPL互換」はあなたに快適さを与えるはずです。オープンソースのものを共有します。必要に応じて変更することもできます。それは理由のためにオープンソースです。
alttag 2017年

@alttagプロジェクトでGPLdコードをコピーまたは使用するということは、同じプロジェクト内の他のすべてのコードもGPLの下にあることを意味します。私は著作権弁護士ではないので、ウェブサイトで公開されているコードに関してそれが何を意味するのかわかりません。
アーロンディグラ2017年

0

python2前にこのコードを使用することができますcsv_writer.writerows(rows)
。このコードはUTF-8文字列に整数を変換しません

def encode_rows_to_utf8(rows):
    encoding_rows = []
    行の行の場合:
        encoding_row = []
        行の値の場合:
            isinstance(value、basestring)の場合:
                value = unicode(value).encode( "utf-8")
            encoding_row.append(value)
        encoding_rows.append(encoded_row)
    encoding_rowsを返す

-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はpython2のutf-8に対して堅牢であるようです。*

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.