20

を使っopen()てファイルを開くと、Unicode文字列を書くことができません。codecsUnicodeエンコーディングでファイルを使用して開く必要があることを学びました( http://docs.python.org/howto/unicode.html#reading-and-writing-unicode-dataを参照)。

次に、いくつかの一時ファイルを作成する必要があります。ライブラリを使用しようとしましたtempfileが、エンコードオプションがありません。を使用して一時ファイルにUnicode文字列を書き込もうとするとtempfile、失敗します。

#!/usr/bin/python2.6
# -*- coding: utf-8 -*-
import tempfile
with tempfile.TemporaryFile() as fh:
  fh.write(u"Hello World: ä")
  fh.seek(0)
  for line in fh:
    print line

PythonでUnicodeエンコーディングを使用して一時ファイルを作成するにはどうすればよいですか?

編集:

  1. Linuxを使用していますが、このコードで表示されるエラーメッセージは次のとおりです。

    Traceback (most recent call last):
      File "tmp_file.py", line 5, in <module>
        fh.write(u"Hello World: ä")
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 13: ordinal not in range(128)
    
  2. これは単なる例です。実際には、APIが返す文字列を書き込もうとしています。
4

7 に答える 7

20

他のすべての人の答えは正しいです。何が起こっているのかを明確にしたいだけです:

'foo'リテラルとリテラルの違いはu'foo'、前者がバイトの文字列で、後者が Unicode オブジェクトであることです。

まず、Unicode が文字セットであることを理解してください。エンコーディングはUTF-8です。Unicode オブジェクトは前者に関するものです。これは Unicode 文字列であり、UTF-8 である必要はありません。あなたの場合、ファイルの最初の行で指定したため、文字列リテラルのエンコーディングは UTF-8 になります。

バイト文字列から Unicode 文字列を取得するには、次の.encode()メソッドを呼び出します。

>>>> u"ひらがな".encode("utf-8") == "ひらがな"
True

同様に、呼び出しで string.encode を呼び出すと、単に .encode をwrite削除した場合と同じ効果が得られuます。

上部にエンコーディングを指定しなかった場合、たとえば別のファイルから Unicode データを読み取っていた場合、Python 文字列に到達する前にどのエンコーディングであったかを指定します。これにより、バイト単位でどのように表現されるか (つまり、str型) が決まります。

取得しているエラーは、モジュールがオブジェクトtempfileを予期しているためです。strこれは、Unicode を処理できないという意味ではなく、Unicode オブジェクトではなくバイト文字列を渡すことを期待しているだけです。エンコーディングを指定しないと、それを一時ファイルに書き込む方法がわからないためです。

于 2012-05-08T00:59:29.517 に答える
1

(u"...")エンコードされた文字列を使用する必要がある一時ファイルにUnicode オブジェクトを書き込もうとしています("...")"encode="エンコーディングは 2 行目で既に指定しているため、明示的にパラメーターを渡す必要はありません("# -*- coding: utf-8 -*-")fh.write("ä")の代わりに使用するだけでfh.write(u"ä")問題ありません。

于 2012-05-08T00:33:38.350 に答える
-1

u をドロップすると、コードが機能しました。

fh.write("Hello World: ä")

すでにユニコードだからだと思います。

于 2012-05-08T00:24:54.920 に答える