4

Unicode のデータがあり、それをファイルに書き込みたいと考えています。私はpython 2.6を使用しています。エンコードされた値を出力できますが、ファイルに書き込むことができません。環境のデフォルトのエンコーディングは UTF-8 です。コーデックも使用しようとしましたが、運もありませんでした。これは、私が使用しているサンプル コード スニペットです。

#!/usr/bin/python
import sys
import codecs
import csv

sh = [u'T\xe9l\xe9vista S.A.', u'T\xe9l\xe9vista S.A.', 'Python']
print sys.stdout.encoding
f = codecs.open('listwrite.txt', 'w', encoding='latin-1')
for item in sh:
  f.write(item)
f.close()

for i in sh:
  print i.encode('latin-1')
#

出力:

UTF-8
Télévista S.A.
Télévista S.A.
Python

Contents of listwrite.txt
Télévista S.A.Télévista S.A.Python
#

上記のように、ファイルは Latin-1 ではなく UTF-8 エンコーディングで書き込まれています。ファイルのデフォルトのエンコーディングを変更してオーバーライドするにはどうすればよいですか。

編集:2

また、csv ライターを使用して書き込むと、UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 1: ordinal not in range(128) が返されます

以下のコード:

#!/usr/bin/python
import sys
import codecs
import csv

sh = [u'T\xe9l\xe9vista S.A.', u'T\xe9l\xe9vista S.A.', 'Python']
print sys.stdout.encoding
c = csv.writer(codecs.open('listwrite.txt', 'w', encoding='latin-1'), quoting=csv.QUOTE_NONE)
c.writerow(sh)
f.close()

for i in sh:
  print i.encode('latin-1')
4

1 に答える 1

3

あなたは間違った角度から問題を攻撃していると思います。代わりに、書き込む前に各行をエンコードしてみてください。

import csv
sh = [u'T\xe9l\xe9vista S.A.', u'T\xe9l\xe9vista S.A.', 'Python']

f = open('listwrite.txt', 'wb') # binary mode
writer = csv.writer(f)
writer.writerow([item.encode('latin-1') for item in sh])
f.close()

これで、適切なlatin1エンコードファイルができました。

$ cat listwrite.txt | iconv -f latin1
Télévista S.A.,Télévista S.A.,Python
$ file listwrite.txt 
listwrite.txt: ISO-8859 text, with CRLF line terminators
于 2012-11-15T18:41:53.097 に答える