1. ホーム
  2. パイソン

[解決済み】PythonでUTF-8ファイルに書き込む

2022-04-07 22:13:08

質問

について、とても混乱しています。 codecs.open function . そうすると

file = codecs.open("temp", "w", "utf-8")
file.write(codecs.BOM_UTF8)
file.close()

というエラーが表示されます。

UnicodeDecodeError: 'ascii' コーデックは、バイト 0xef in position をデコードできません。 0: 序数が範囲(128)内ではない

そうすると

file = open("temp", "w")
file.write(codecs.BOM_UTF8)
file.close()

正常に動作しています。

質問 は、なぜ最初のメソッドが失敗するのでしょうか?また、Bomを挿入するにはどうすればいいのでしょうか?

もし、2番目の方法が正しい方法であるなら、何のために codecs.open(filename, "w", "utf-8") ?

解決方法は?

私は、この問題は codecs.BOM_UTF8 はバイト文字列であり、ユニコード文字列ではありません。ファイルハンドラは、quot;私はUTF-8エンコードされたテキストとしてUnicodeを書くことを意味しているのに、あなたは私にバイト文字列を与えました!"に基づいて、あなたが本当に言いたいことを推測しようとしているのだと思います。

バイトオーダーマークのユニコード文字列(つまりユニコードU+FEFF)を直接書いてみて、ファイルがそれをUTF-8としてエンコードするだけにします。

import codecs

file = codecs.open("lol", "w", "utf-8")
file.write(u'\ufeff')
file.close()

(これで正解のようです。バイト数EF BB BFのファイルです。)

EDIT: S. Lottの 提案 エンコーディングに "utf-8-sig" を使用することは、自分で明示的に BOM を書くよりも良い方法ですが、以前何が間違っていたかを説明してくれているので、この回答をここに残しておきます。