2012-04-25 6 views
3

Python3.2を使用していくつかのファイルを読み込もうとしていますが、一部のファイルにはにUnicodeが含まれている場合があります。Unicodeファイルを読む - Python3.2

私は試してみてください。

file = open(item_path + item, encoding="utf-8") 
for line in file: 
    print (repr(line)) 

私はエラーを取得する:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 13-16: ordinal not in range(128) 

は、私がここにドキュメントを、次の午前:http://docs.python.org/release/3.0.1/howto/unicode.html

はなぜPythonがどんなでASCIIにエンコードしようとしていることになりますこのコードのポイント?

+2

明確にする:ここでUnicodeを記述すると、UTF-8を意味しますか?また、すべてのファイルがUTF-8であるように聞こえますが、一部はASCIIであるサブセットのみを含む場合もあります。 –

+0

それは正しいです。 –

+0

http://stackoverflow.com/a/983752/680372 – pylover

答えて

2

出力エンコードは何ですか? print()へのコールを削除すると、動作し始めますか?

UTF-8以外のロケールがあると思われますので、Pythonはrepr(line)をASCIIとしてエンコードしようとしています。

問題を解決するには、文字列をエンコードしてバイト配列を出力するか、デフォルトのエンコーディングを文字列を処理できるものに設定する必要があります(UTF-8は明白な選択です)。

+0

はい、正しいです。問題を引き起こしているのは印刷だけです。行を何か他のものに渡すと(例えば、QListView)、それらはうまく表示されます。 –

3

問題は、Python 3のrepr(line)もUnicode文字列を返すことです。上記の128文字をASCIIエスケープシーケンスに変換しません。

エスケープシーケンスを表示する場合は、代わりにascii(line)を使用してください。

実際には、repr(line)は、ソースコード内に配置されていると同じ値のオブジェクトを生成する文字列を返すと予想されます。このようにして、Python 3の動作は、ASCII文字以外の文字列を表現するためにソースファイルにASCIIエスケープシーケンスが必要ないため、問題ありません。これらの日にUTF-8やその他のUnicodeエンコーディングを使用するのは当然です。真実は、Python 2がそのような文字のエスケープシーケンスを生成したことです。