[解決済み] 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'Capitxe1n'", "'Capitxc3xa1n'")
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'
私はここで何を理解していないのだろうか?明らかに私が見逃している重要な魔法(または良識)があるのです。テキストファイルに何を入力すれば、適切な変換ができるのでしょうか?
私がここで本当に理解できていないのは、Pythonが外部からUTF-8を認識できないのであれば、UTF-8表現のポイントは何なのか、ということです。文字列をJSONダンプして、代わりにそれを使うべきかもしれませんね。もっと重要なのは、ファイルから入ってきたときにPythonが認識してデコードする、このUnicodeオブジェクトのASCII表現はあるのでしょうか? もしそうなら、どうやってそれを手に入れるのですか?
>>> print simplejson.dumps(ss)
'"Capit\u00e1n"'
>>> print >> file('f3','w'), simplejson.dumps(ss)
>>> simplejson.load(open('f3'))
u'Capit\xe1n'
解決方法は?
表記法では
u'Capit\xe1n\n'
は1バイトを表し、quot;e1;は16進数であることを表しています。 と書くと
Capit\xc3\xa1n
の中に、" \xc3" が入っていますね。これは4バイトで、コードの中では全部読んでいます。表示させるとわかると思います。
>>> open('f2').read()
'Capit\\xc3\\xa1n\n'
バックスラッシュでエスケープされているのがわかると思います。つまり、文字列には "\", "x", "c", "3" の4バイトが含まれることになります。
編集してください。
他の方の回答にもあるように、エディタに文字を入力すれば、エディタがUTF-8に変換して保存してくれるはずです。
実際にこの形式の文字列がある場合は
string_escape
コーデックで通常の文字列にデコードします。
In [15]: print 'Capit\\xc3\\xa1n\n'.decode('string_escape')
Capitán
その結果、UTF-8でエンコードされた文字列となり、アクセント記号付きの文字は、次の2バイトで表されます。
\\xc3\\xa1
を元の文字列に追加します。ユニコード文字列にしたい場合は、再度UTF-8でデコードする必要があります。
編集へ:あなたのファイルにはUTF-8がありません。実際にどのように見えるかを見るには
s = u'Capit\xe1n\n'
sutf8 = s.encode('UTF-8')
open('utf-8.out', 'w').write(sutf8)
ファイルの内容を比較する
utf-8.out
を、エディタで保存したファイルの内容と比較します。
関連
-
Python 人工知能 人間学習 描画 機械学習モデル作成
-
[解決済み】TypeErrorの修正方法。Unicodeオブジェクトは、ハッシュ化する前にエンコードする必要がある?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] Pythonが解釈される場合、.pycファイルとは何ですか?
-
[解決済み] 他のPythonファイルをインポートするには?
-
[解決済み] UTF-8とBOMなしUTF-8の違いは何ですか?
-
[解決済み] Pythonのunicode文字列のアクセントを除去(正規化)する最良の方法は何ですか?
-
[解決済み] UTF-8とUnicodeの違いは何ですか?
-
[解決済み] UTF-8、UTF-16、およびUTF-32
-
[解決済み】Pythonでディレクトリ内の拡張子.txtのファイルをすべて検索する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ピロウズ画像色処理の具体的な活用方法
-
Python jiabaライブラリの使用方法について説明
-
Pythonを使って簡単なzipファイルの解凍パスワードを手作業で解く
-
Python Pillow Image.save jpg画像圧縮問題
-
[解決済み】TypeError: re.findall()でバイトのようなオブジェクトに文字列パターンを使用することはできません。)
-
[解決済み】LogisticRegression: Pythonでsklearnを使用して、未知のラベルタイプ: '連続'を使用しています。
-
[解決済み】SyntaxError: デフォルト以外の引数がデフォルトの引数に続く
-
[解決済み】Flask ImportError: Flask という名前のモジュールがない
-
[解決済み】 TypeError: += でサポートされていないオペランド型: 'int' および 'list' です。
-
[解決済み] htmlファイルの開き方を教えてください。