Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将YAML文件转换为Python JSON对象_Python_Json_Python 3.x_Yaml - Fatal编程技术网

将YAML文件转换为Python JSON对象

将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

如何加载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
你可以用

在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"
  }
}