将YAML文件转换为Python JSON对象
如何加载YAML文件并将其转换为Python JSON对象 我的YAML文件如下所示:将YAML文件转换为Python JSON对象,python,json,python-3.x,yaml,Python,Json,Python 3.x,Yaml,如何加载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 si
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
你可以用
在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
注:PyYAML仅支持2009年之前的YAML 1.1规范。如果需要YAML 1.2,则ruamel.YAML是一个选项
pip install ruamel.yaml
在python3中,您可以使用
然后加载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 1.2规范,使YAML成为JSON的超集,那么您应该使用(免责声明:我是该包的作者,它是PyYAML的分支) 它生成
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
和值(分别为True
、True
和False
)。不仅是前面的评论所说的,而且您使用的是IPython的控制台,而不是普通的Python控制台;)1) OP请求的JSON在哪里?JSON有双引号。2) PyYAML的load()
被证明是不安全的,没有理由在这里(或几乎在其他任何地方)使用它而不是safe\u load()
。3) 您没有提到PyYAML只支持旧的、2009年之前的YAML 1.1规范。你说Python中的JSON类型是什么意思,也许你可以帮我读一下。其他评论和你的答案一样好,也很有趣,谢谢。我同意,这是一个更清晰的答案。我将在这里留下我的答案,因为它包括了文件处理部分,尽管没有特别要求它,因为它可能经常需要。当您提到另一个答案被清除时,我复制了pip安装部分,谢谢。PyYAML的load()
被证明是不安全的,在这里(或几乎任何其他地方)使用它而不是safe\u load()
,这是没有理由的。你没有提到PyYAML只支持旧的、2009年之前的YAML 1.1规范。我不知道,我会在回答中包括它,谢谢。为了跟踪PyYAML规范:PyYAML的load()
被证明是不安全的,没有理由在这里(或几乎任何其他地方)使用它而不是safe\u load()
。像许多其他人一样,您没有提到PyYAML只支持旧的、2009年之前的YAML 1.1规范。感谢分享。帮了大忙!感谢您开发了一个现代化和更高质量的软件包。PyYAML不是废弃软件,最新版本(5.4.1)是2021年1月。你提交PRs只是为了让它们被拒绝,还是你没有试图修复原始版本就放弃了?@Dave PRs没有被拒绝,几年来一直没有答案,然后项目被移动,打开PRs,在这个过程中,问题被丢弃了。我没有看到IMO自3.12以来保证重大版本号更改的任何东西,PyYAML仍然在2009年被取代的标准上。
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"}}
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)
{
"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"
}
}