pyyamlでハマったこと
やりたかったこと
数値計算したデータを保存する時、二次元データならcsvでこと足りるが、dict型などのもっと複雑な構造を持ったデータをまとめて保存したいことがある。pickleを使う方法もあるが、pickleで保存してしまうとpythonを経由しないとデータが読めない。一方yamlならpyyamlを使うことでdict型を簡単に保存しつつ、テキストエディタからも読めるのでよい。
ハマったこと
dict -> yaml -> dict としたときに、dictの順序がどうなっているか?
pythonは3.7から辞書の順序を保存するようになっているので、当然順序を保存していてほしい……
が、実際は保存しない:
import yaml
din = {"c":3,"b":2, "a":1}
fname = "tmp.yaml"
with open(fname,"w") as f:
yaml.dump(din,f)
print(din)
# {"c":3,"b":2, "a":1}
print(yaml.dump(din))
# {"a":1,"b":2, "c":3}
with open(fname) as f:
dout=yaml.safe_load(f)
print(dout)
# {"a":1,"b":2, "c":3}
このようにdumpの段階で順序構造が破壊されてしまう。
解決策
愚直なのは保存時にキーの順序も出力し保存しておく方法。
或いはOrderedDictを使うようにする方法もある。
Author And Source
この問題について(pyyamlでハマったこと), 我々は、より多くの情報をここで見つけました https://qiita.com/gomeshun/items/2a0fa71c89b0e6e01551著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .