YAMLファイルを読み込み、Python JSONオブジェクトに変換するにはどうすればよいですか?
私のYAMLファイルは次のようになります。
Section:
heading: Heading 1
font:
name: Times New Roman
size: 22
color_theme: ACCENT_2
SubSection:
heading: Heading 3
font:
name: Times New Roman
size: 15
color_theme: ACCENT_2
Paragraph:
font:
name: Times New Roman
size: 11
color_theme: ACCENT_2
Table:
style: MediumGrid3-Accent2
PyYAML
を使用できます
pip install PyYAML
そして、ipythonコンソールで:
In [1]: import yaml
In [2]: document = """Section:
...: heading: Heading 1
...: font:
...: name: Times New Roman
...: size: 22
...: color_theme: ACCENT_2
...:
...: SubSection:
...: heading: Heading 3
...: font:
...: name: Times New Roman
...: size: 15
...: color_theme: ACCENT_2
...: Paragraph:
...: font:
...: name: Times New Roman
...: size: 11
...: color_theme: ACCENT_2
...: Table:
...: style: MediumGrid3-Accent2"""
...:
In [3]: yaml.load(document)
Out[3]:
{'Paragraph': {'font': {'color_theme': 'ACCENT_2',
'name': 'Times New Roman',
'size': 11}},
'Section': {'font': {'color_theme': 'ACCENT_2',
'name': 'Times New Roman',
'size': 22},
'heading': 'Heading 1'},
'SubSection': {'font': {'color_theme': 'ACCENT_2',
'name': 'Times New Roman',
'size': 15},
'heading': 'Heading 3'},
'Table': {'style': 'MediumGrid3-Accent2'}}
PyYAMLライブラリはこの目的のために意図されています
pip install pyyaml
import yaml
import json
with open("example.yaml", 'r') as yaml_in, open("example.json", "w") as json_out:
yaml_object = yaml.safe_load(yaml_in) # yaml_object will be a list or a dict
json.dump(yaml_object, json_out)
注:PyYAMLは、2009年以前のYAML 1.1仕様のみをサポートしています。
ruamel.yamlは、YAML 1.2が必要な場合のオプションです。
pip install ruamel.yaml
Python3では、 pyyaml を使用できます。
$ pip3 install pyyaml
次に、yamlファイルをロードしてjsonにダンプします。
import yaml, json
with open('./file.yaml') as f:
print(json.dumps(yaml.load(f)))
出力:
{"Section": null, "heading": "Heading 1", "font": {"name": "Times New Roman", "size": 22, "color_theme": "ACCENT_2"}, "SubSection": {"heading": "Heading 3", "font": {"name": "Times New Roman", "size": 15, "color_theme": "ACCENT_2"}}, "Paragraph": {"font": {"name": "Times New Roman", "size": 11, "color_theme": "ACCENT_2"}}, "Table": {"style": "MediumGrid3-Accent2"}}
Python JSONオブジェクト。JSONは、JavaScriptでそのルートを見つける言語に依存しないファイル形式であり、多くの言語でサポートされています。
YAMLドキュメントが古い1.1標準、つまり2009年以前に準拠している場合、他の回答のいくつかで提案されているようにPyYAMLを使用できます。
YAMLをJSONのスーパーセットにした新しいYAML 1.2仕様を使用する場合は、 _ruamel.yaml
_ を使用する必要があります(免責事項:私はPyYAMLのフォークであるそのパッケージの作成者です) )。
_import ruamel.yaml
import json
in_file = 'input.yaml'
out_file = 'output.json'
yaml = ruamel.yaml.YAML(typ='safe')
with open(in_file) as fpi:
data = yaml.load(fpi)
with open(out_file, 'w') as fpo:
json.dump(data, fpo, indent=2)
_
_output.json
_を生成します:
_{
"Section": {
"heading": "Heading 1",
"font": {
"name": "Times New Roman",
"size": 22,
"color_theme": "ACCENT_2"
}
},
"SubSection": {
"heading": "Heading 3",
"font": {
"name": "Times New Roman",
"size": 15,
"color_theme": "ACCENT_2"
}
},
"Paragraph": {
"font": {
"name": "Times New Roman",
"size": 11,
"color_theme": "ACCENT_2"
}
},
"Table": {
"style": "MediumGrid3-Accent2"
}
}
_
_ruamel.yaml
_は、YAML 1.2のサポートとは別に、多くのPyYAMLバグが修正されています。また、常に入力を完全に制御できない場合、PyYAMLのload()
も安全でないと文書化されていることに注意する必要があります。 PyYAMLは、スカラー番号_021
_を_17
_の代わりに整数_21
_としてロードし、 on
、yes
、off
からboolean 値(それぞれTrue
、True
およびFalse
)。