LoginSignup
0
1

More than 3 years have passed since last update.

pyyamlでハマったこと

Last updated at Posted at 2020-12-03

やりたかったこと

数値計算したデータを保存する時、二次元データなら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を使うようにする方法もある。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1