web-dev-qa-db-fra.com

Conversion d'un fichier YAML en Python JSON

Comment puis-je charger un fichier YAML et le convertir en un objet JSON Python JSON?

Mon fichier YAML ressemble à ceci:

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

vous pouvez utiliser PyYAML

pip install PyYAML

Et dans la console 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

La bibliothèque PyYAML est destinée à cet effet

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)

Remarques: PyYAML prend uniquement en charge la spécification YAML 1.1 antérieure à 2009.
ruamel.yaml est une option si YAML 1.2 est requis.

pip install ruamel.yaml
4
Vemund Kvam

En python3, vous pouvez utiliser pyyaml .

$ pip3 install pyyaml

Ensuite, vous chargez votre fichier yaml et le videz dans json:

import yaml, json

with open('./file.yaml') as f:
    print(json.dumps(yaml.load(f)))

Sortie:

{"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

Il n'existe pas d'objet JSON Python JSON. JSON est un format de fichier indépendant de la langue qui trouve ses racines dans JavaScript et est pris en charge par de nombreuses langues.

Si votre document YAML est conforme à l'ancienne norme 1.1, c'est-à-dire avant 2009, vous pouvez utiliser PyYAML comme suggéré par certaines des autres réponses.

S'il utilise la nouvelle spécification YAML 1.2, qui a fait de YAML un sur-ensemble de JSON, vous devez utiliser ruamel.yaml (avertissement: je suis l'auteur de ce package, qui est une fourchette de 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)

qui génère 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, En plus de prendre en charge YAML 1.2, de nombreux bogues PyYAML ont été corrigés. Vous devez également noter que la fonction load() de PyYAML est également documentée comme non sûre, si vous n'avez pas le contrôle total sur l'entrée à tout moment. PyYAML charge également les nombres scalaires 021 Sous forme d'entier 17 Au lieu de 21 Et convertit les chaînes scalaires comme on, yes, off en booléen valeurs (resp. True, True et False).

1
Anthon