ファイルへのテキストの読み取りと書き込みを理解するのに頭が混乱しています (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 ではサポートされません)。
>>> import codecs
>>> f = codecs.open("test", "r", "utf-8")
>>> f.read()
u'Capit\xe1l\n\n'