通过Python3读写YAML文件

时间:2019-06-06 09:25:35

标签: python python-3.x yaml

我正在编写一个小的python脚本(python 3.7),该脚本应该读写YAML文件。目前,我正要读取给定的YAML文件。我导入了YAML库,并尝试读取该文件。我目前遇到的问题是输出没有像原始文件中那样嵌套。

如何以结构化的方式编写YAML文件,如下节所示。

我的代码:

import yaml

with open("/Users/Ilumeyss/Desktop/05_PS_ITM/xDQ_Datenqualitaetsvereinbarung_1003222_2018-10-16_v22yaml.sec", 'r') as stream:
    try:
        print(yaml.safe_load(stream))
    except yaml.YAMLError as exc:
        print(exc)

这就是我想要的:

  

projectElements:
公司:
  供应商:
  dataSupplierInformation:
  名称:   “ Textilfabrik GmbH&Co. KG”

  地址:   {strasse:“ Industriestr 1”,plz:“ 72555”,ort:“ Metzingen”,土地:   “德国”}

  xdqNr:   1001001
              dataUserInformation:
                  名称:   “ Handel24 Deutschland AG”
                  地址:   {strasse:“ Handelsweg 42”,plz:“ 74078”,ort:“ Heilbronn”,土地:   “德国”}
                  xdqNr:   1001002
          文件信息:
              文件名:   “ Datenqualitaetsvereinbarung”
              xdqNr:   1003222

这是我到目前为止得到的:

  

{'projectElements':{'company':{'供应商':   {'dataSupplierInformation':{'name':'Textilfabrik GmbH&Co. KG',   “地址”:

     

...等等

1 个答案:

答案 0 :(得分:0)

要在加载YAML文档时打印它,应该转储 加载的数据到stdout。我建议使用ruamel.yaml,因为它支持 这种往返比PyYAML好得多(免责声明:我是ruamel.yaml的作者)。 PyYAML仅支持YAML 1.1,而在2009年已经过时。

如果您输入的是xDQ_Datenqualitaetsvereinbarung_1003222_2018-10-16_v22yaml.sec

projectElements: 
  company:
    supplier:
      dataSupplierInformation:
        name: "Textilfabrik GmbH & Co. KG"

        address: {strasse: "Industriestr 1", plz: "72555", ort: "Metzingen", land: "Germany"}

        xdqNr: 1001001
      dataUserInformation:
        name: "Handel24 Deutschland AG"
        address: {strasse: "Handelsweg 42", plz: "74078", ort: "Heilbronn", land: "Germany"}
        xdqNr: 1001002
      documentinformation:
        dokumentname: "Datenqualitaetsvereinbarung"
        xdqNr: 1003222

以及您的程序:

import sys
from pathlib import Path
import ruamel.yaml

infile = Path('xDQ_Datenqualitaetsvereinbarung_1003222_2018-10-16_v22yaml.sec')

yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
data = yaml.load(infile)
yaml.dump(data, sys.stdout)

您的输出将是:

projectElements:
  company:
    supplier:
      dataSupplierInformation:
        name: "Textilfabrik GmbH & Co. KG"

        address: {strasse: "Industriestr 1", plz: "72555", ort: "Metzingen", land: "Germany"}

        xdqNr: 1001001
      dataUserInformation:
        name: "Handel24 Deutschland AG"
        address: {strasse: "Handelsweg 42", plz: "74078", ort: "Heilbronn", land: "Germany"}
        xdqNr: 1001002
      documentinformation:
        dokumentname: "Datenqualitaetsvereinbarung"
        xdqNr: 1003222

并且您无法以任何简单的方式通过PyYAML获得完全相同的输出。