自分はあまり使ってこなかったのですが、構造化したデータを保存するのに利用されるYAMLというデータ形式が存在します。いかにもPythonと相性が良さそうなフォーマットです。
参考: YAML – Wikipedia
最近、そこそこ大きいYAMLファイルの総チェックを行う必要があったので、Pythonでスクリプトを書いてチャチャっとやりました。その時のYAMLの読み込み方法のメモと、ついでに逆にデータをYAMLに書き出す方法を残しておきます。
サンプルとしては、次の内容が保存した sample.yaml というファイルを使います。
name: John Doe
age: 30
address:
city: Tokyo
country: Japan
必要なライブラリはいくつかありますがPyYAMLが代表的です。インストール時と利用時で名前が違うので注意してください。
参考: PyYAML · PyPI
# インストールコマンド
$ pip install PyYAML
# Pythonでインポートする時
>>> import yaml
それではやっていきましょう。まずはYAMLファイルの読み込みからです。
YAMLを読み込むメソッドは、load(), load_all(), safe_load(), safe_load_all() と4つも用意されています。普通はsafe_load()を使えば良いです。safeがついてない2メソッドにはセキュリティ面のリスクもあるので使用を避けることを推奨します。
import yaml
with open("sample.yaml", "r") as f:
data = yaml.safe_load(f)
print(data)
# {'name': 'John Doe', 'age': 30, 'address': {'city': 'Tokyo', 'country': 'Japan'}}
簡単ですね。気をつけないといけないのは、safe_load()にファイルパスを渡しても読み込んではくれず、openでファイルを開いて、それを渡すって点です。
YAMLファイルは、”—“というセパレーターを使うことで単一ファイルの中に複数のYAMLオブジェクトを記述できますが、そのようなファイルを読み込むときはsafe_load_all()の方を使うので注意してください。読み込んだ結果はジェネレーターで返ってきます。
ファイルにするが手間だったのでセパレーターで区切られたYAML文字列を直接作ってやって見ました。
yaml_data = yaml.safe_load_all("""name: John Doe
age: 30
---
name: Jane Smith
age: 25
---
name: Bob Johnson
age: 40""".strip())
for y in yaml_data:
print(y)
"""
{'name': 'John Doe', 'age': 30}
{'name': 'Jane Smith', 'age': 25}
{'name': 'Bob Johnson', 'age': 40}
"""
以上が、YAMLの読み込みです。
次は書き出しです。最初のコード例の、data変数をYAML形式ファイルに保存してみます。
保存には yaml.safe_dump() というメソッドを使います。これにPythonのオブジェクトを渡すとYAMLのテキストに変換してくれます。
print(yaml.safe_dump(data))
"""
address:
city: Tokyo
country: Japan
age: 30
name: John Doe
"""
ただし、普通はファイルに保存することになると思いますので、次のように使うことになると思います。
with open("output.yaml", "w") as f:
yaml.safe_dump(data, f)
これで先ほどのテキストが、”output.yaml”ファイルに保存されます。
YAMLには一般的なブロックスタイルと、JSONに近い見た目のフロースタイルという形式がありますが、defalut_flow_style という引数をTrueにすると、フロースタイルで出力できます。ただ、これは使うことあまり無いかな。
また、インデントの数はindentという引数で指定できます。デフォルトは2ですね。
以上がPythonを用いたYAMLファイルの読み書き方法でした。