設定ファイルで読み書きする場合、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