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
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'}}
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
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"}}
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
).