Python での Unicode (UTF-8) ファイルの読み取りと書き込み 質問する

Python での Unicode (UTF-8) ファイルの読み取りと書き込み 質問する

ファイルへのテキストの読み取りと書き込みを理解するのに頭が混乱しています (Python 2.4)。

# The string, which has an a-acute in it.
ss = u'Capit\xe1n'
ss8 = ss.encode('utf8')
repr(ss), repr(ss8)

("u'Capit\xe1n'、"'Capit\xc3\xa1n'")

print ss, ss8
print >> open('f1','w'), ss8

>>> file('f1').read()
'Capit\xc3\xa1n\n'

Capit\xc3\xa1nそこで、お気に入りのエディターのファイル f2 に入力します。

それから:

>>> open('f1').read()
'Capit\xc3\xa1n\n'
>>> open('f2').read()
'Capit\\xc3\\xa1n\n'
>>> open('f1').read().decode('utf8')
u'Capit\xe1n\n'
>>> open('f2').read().decode('utf8')
u'Capit\\xc3\\xa1n\n'

ここで私が理解していないことは何でしょうか? 明らかに、私が見逃している重要な魔法 (または良識) があります。適切な変換を行うには、テキスト ファイルに何を入力すればよいのでしょうか?

ここで本当に理解できないのは、UTF-8 表現が外部から来たときに Python に認識させることができないのであれば、UTF-8 表現の意味が何なのかということです。文字列を JSON でダンプして、代わりにそれを使うべきかもしれません。JSON には ASCII 表現があるからです。もっと重要なことは、ファイルから来たときに Python が認識してデコードするこの Unicode オブジェクトの ASCII 表現はあるのでしょうか。あるとしたら、どうすれば入手できますか。

>>> print simplejson.dumps(ss)
'"Capit\u00e1n"'
>>> print >> file('f3','w'), simplejson.dumps(ss)
>>> simplejson.load(open('f3'))
u'Capit\xe1n'

ベストアンサー1

.encodeとをいじるのではなく.decode、ファイルを開くときにエンコーディングを指定します。ioモジュールPython 2.6 で追加された は、io.openファイルの を指定できる関数を提供しますencoding

ファイルが UTF-8 でエンコードされていると仮定すると、次を使用できます。

>>> import io
>>> f = io.open("test", mode="r", encoding="utf-8")

次に、f.readデコードされた Unicode オブジェクトを返します。

>>> f.read()
u'Capit\xe1l\n\n'

3.x では、io.open関数は組み込みopen関数のエイリアスであり、encoding引数をサポートします (2.x ではサポートされません)。

また、opencodecs標準ライブラリモジュールから:

>>> import codecs
>>> f = codecs.open("test", "r", "utf-8")
>>> f.read()
u'Capit\xe1l\n\n'

ただし、これは混合時に問題が発生する可能性がありread()readline()

おすすめ記事