web-dev-qa-db-ja.com

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

PyQt4 QTableWidgetからcsv形式のテキストファイルを作成しようとしています。テキストに特殊文字が含まれているため、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")

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

74
Martin

シェルから実行:

pip2 install unicodecsv

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

97
guaka

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の場合、 here を探します。

66
Zanon

このパッケージを使用すると、動作します: https://github.com/jdunck/python-unicodecsv

14
Gijs

私にとっては、Python 2 CSVモジュールのドキュメントからのUnicodeWriterクラスは、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関数を追加することもできます。演習は読者に任されています。

3

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

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

2
Aaron Digulla

python2の場合、csv_writer.writerows(rows)の前にこのコードを使用できます
このコードは、整数をutf-8文字列に変換しません

 def encode_rows_to_utf8(rows):
 encoded_rows = [] 
行の行:
 encoded_row = [] 
行の値:
 if isinstance(value、basestring):
 value = unicode(value).encode( "utf-8")
 encoded_row.append(value)
 encoded_rows。 append(encoded_row)
 return encoded_rows 
0
pymen