1. ホーム
  2. パイソン

[解決済み】Unicodeテキストをテキストファイルに書き込む?

2022-04-03 16:51:40

質問

Googleドキュメントからデータを取り出し、加工してファイルに書き込んでいます(最終的にはWordpressのページに貼り付ける予定です)。

非ASCIIの記号がいくつかあります。これをHTMLソースで使用できる記号に安全に変換するにはどうしたらよいでしょうか?

現在は、途中ですべてをUnicodeに変換して、Pythonの文字列で結合して、やっています。

import codecs
f = codecs.open('out.txt', mode="w", encoding="iso-8859-1")
f.write(all_html.encode("iso-8859-1", "replace"))

最終行でエンコードエラーが発生しています。

UnicodeDecodeError: 'ascii' コーデックは、バイト 0xa0 in position 12286: 序数が範囲(128)内ではない

部分的に解決。

このPythonはエラーにならずに実行されます。

row = [unicode(x.strip()) if x is not None else u'' for x in row]
all_html = row[0] + "<br/>" + row[1]
f = open('out.txt', 'w')
f.write(all_html.encode("utf-8"))

でもって、実際のテキストファイルを開くと、こんな記号がたくさん出てくる。

Qur’an 

もしかして、テキストファイル以外のものに書き込む必要があるのかな?

どのように解決するのですか?

最初に手に入れたものをユニコードオブジェクトにデコードし、途中で必要に応じてエンコードすることで、できるだけユニコードオブジェクトのみを扱うようにします。

文字列が実際にユニコード・オブジェクトである場合、それをファイルに書き込む前にユニコード・エンコードされた文字列オブジェクトに変換する必要があります。

foo = u'Δ, Й, ק, ‎ م, ๗, あ, 叶, 葉, and 말.'
f = open('test', 'w')
f.write(foo.encode('utf8'))
f.close()

そのファイルをもう一度読むと、ユニコード・エンコードされた文字列が得られ、それをデコードしてユニコード・オブジェクトにすることができます。

f = file('test', 'r')
print f.read().decode('utf8')