ウィリアムのいたずらの、まちあるき、たべあるきーPART2

gooブログ「ウィリアムのいたずらの、まちあるき、たべあるき」がお引越ししてきました

jupyterで漢字をファイル書き出したら\u672Cとかになる件(JSON→YAML変換の例)

APIでやり取りする場合、JSON形式が便利だけど、
設定ファイルで読み書きする場合、JSONだと、
  カッコの形や数を気にしなけりゃいけないし、 
  基本改行は入れないものだし・・・
てなことで、面倒。

そこで、APIの通信ではJSON、設定ファイルはYAMLで書くというのが
より良い解決法となる。
そしてこの場合、JSON→YAML変換と、YAML→JSON変換が必要になる。




で、単純にYAML変換すると、
import json
f=open('C:\\Users\\user\\Desktop\\sample.txt','r', encoding='utf-8')
dic = json.load(f)

fout= open('C:\\Users\\user\\Desktop\\sample.yaml', 'w')
print(yaml.dump(dic),file=fout)
fout.close()

となる(もちろん、あとに示すエントリで書いた ast.literal_evalで書いてもいいけど)。

このとき、

JSONをPythonで読み込ませるとき、シングルクォートとかでうまく読み込まない場合は
https://blog.goo.ne.jp/xmldtp/e/f3c3830c3f6720bc81b22b844a2b11a5


で使ったJSONファイルを(UTF-8で)入力ファイルとして、読み込むと、
出力はうまくいく場合もある。

でも、自分のjupyter notebook(Windows10環境)で実行したら、こんなかんじ
- "\u672C\u6570": 868
  "\u6C0F\u540D": "\u738B\u8C9E\u6CBB"
  "\u9806\u4F4D": 1
- "\u672C\u6570": 657
  "\u6C0F\u540D": "\u91CE\u6751\u514B\u4E5F"
  "\u9806\u4F4D": 2
- "\u672C\u6570": 567
  "\u6C0F\u540D": "\u9580\u7530\u535A\u5149"
  "\u9806\u4F4D": 3
- "\u672C\u6570": 536
  "\u6C0F\u540D": "\u5C71\u672C\u6D69\u4E8C"
  "\u9806\u4F4D": 4
- "\u672C\u6570": 525
  "\u6C0F\u540D": "\u6E05\u539F\u548C\u535A"
  "\u9806\u4F4D": 5


で、漢字の部分が、\uなんとかという形でかきだされてしまう。
これはこまる。

ということで、どうしたら、漢字で書きだしてくれるかだけど、
yaml.dump(dic)で出てきたものを、codecs.decodeで変換すると、
うまくいく。こんなかんじ

# coding: utf-8
import ast
import yaml
import json
import codecs

fin= open('C:\\Users\\user\\Desktop\\sample.txt', 'r', encoding='utf-8')
data=fin.read()
fin.close()

dic = ast.literal_eval(data)

fout= open('C:\\Users\\user\\Desktop\\sample.yaml', 'w')
print(codecs.decode(yaml.dump(dic), 'unicode-escape'),file=fout)
fout.close()



結果

- "本数": 868
  "氏名": "王貞治"
  "順位": 1
- "本数": 657
  "氏名": "野村克也"
  "順位": 2
- "本数": 567
  "氏名": "門田博光"
  "順位": 3
- "本数": 536
  "氏名": "山本浩二"
  "順位": 4
- "本数": 525
  "氏名": "清原和博"
  "順位": 5


できた。

■参考サイト
【Python3】文字列を\uを含む文字列に変換する。元に戻す。
http://uni8inu.hatenablog.com/entry/2016/11/11/101209