読者です 読者をやめる 読者になる 読者になる

Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

PyYAMLでロード時にUnicodeオブジェクトを返す方法

スポンサードリンク

f:id:fa11enprince:20150725231409j:plain
Python2系の話です。Cygwin環境を前提としています。
PyYAMLというのを使ってYAML形式のファイルを取り込みます。
まずはインストール方法

インストール

http://pyyaml.org/wiki/PyYAML
のZIP Packageをダウンロードして

$ python setup.py install

でインストール。
動作確認してみます。
UTF-8で文字列をコード内ではUnicode型で扱うようなコードを書いてみます。
YAMLのファイルはこんな感じ

test.yaml

さとしくん:
  - 年齢 : 29
  - 身長 : 150cm
  - 体重 : 49kg
まつこさん:
  - 年齢 : 48
  - 身長 : 170cm
  - 体重 : 119kg

次のプログラムで読ませます。

うまくいかないケース

実行結果

$ ./l1.py
{u'\u307e\u3064\u3053\u3055\u3093': [{u'\u5e74\u9f62': 48}, {u'\u8eab\u9577': '170cm'}, {u'\u4f53\u91cd': '119kg'}], u'\u3055\u3068\u3057\u304f\u3093': [{u'\u5e74\u9f62': 29}, {u'\u8eab\u9577': '150cm'}, {u'\u4f53\u91cd': '49kg'}]}

あら、…一部がstr型のままになってます。うまくいかないようです…どうも、デフォルトのままだとloadしたときにUnicode型で返してくれないようです。
なので、以下のようにデフォルトのハンドラーを書き換えます。

うまくいくケース

実行結果

$ ./l2.py
{u'\u307e\u3064\u3053\u3055\u3093': [{u'\u5e74\u9f62': 48}, {u'\u8eab\u9577': u'170cm'}, {u'\u4f53\u91cd': u'119kg'}], u'\u3055\u3068\u3057\u304f\u3093': [{u'\u5e74\u9f62': 29}, {u'\u8eab\u9577': u'150cm'}, {u'\u4f53\u91cd': u'49kg'}]}

うまくいきました。