web-dev-qa-db-ja.com

YAMLファイルをPython JSONオブジェクトに変換する

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
10
ReKx

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'}}
10
Bear Brown

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)

注:PyY​​AMLは、2009年以前のYAML 1.1仕様のみをサポートしています。
ruamel.yamlは、YAML 1.2が必要な場合のオプションです。

pip install ruamel.yaml
4
Vemund Kvam

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"}}
3
Yuancheng

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_としてロードし、 onyesoffからboolean 値(それぞれTrueTrueおよびFalse)。

1
Anthon