【问题标题】:pyyaml 3.11 pass dictionary to iterator?pyyaml 3.11 将字典传递给迭代器?
【发布时间】:2016-12-08 22:40:22
【问题描述】:

我使用以下 YAML 数据:

Document:
 InPath: /home/me
 OutPath: /home/me
 XLOutFile: TestFile1.xlsx

Sheets: 
  - Sheet: Test123
    InFile: Test123.MQSC
    Server: Testsystem1
  - Sheet: Test345
    InFile: Test345.MQSC
    Server: Testsystem2

Title:
    A: "Server Name"
    B: "MQ Version"
    C: "Broker Version"

Fields:
    A: ServerName
    B: MQVersion
    C: BrokerVersion

以下代码:

import yaml

class cfgReader():
    def __init__(self):
        self.stream = ""
        self.ymldata = ""
        self.ymlkey = ""
        self.ymld = ""

    def read(self,infilename):
        self.stream = self.stream = file(infilename, 'r') #Read the yamlfile
        self.ymldata = yaml.load(self.stream)    #Instanciate yaml object and parse the input "stream".

    def docu(self):
        print self.ymldata
        print self.ymldata['Sheets']
        for self.ymlkey in self.ymldata['Document']: #passes String to iterator
            print self.ymlkey
        for sheets in self.ymldata['Sheets']:  #passes Dictionary to iterator
            print sheets['Sheet']
        for title in self.ymldata['Title']:
            print title
        for fields in self.ymldata['Fields']:
            print fields

print 输出为:

{'Fields': {'A': 'ServerName', 'C': 'BrokerVersion', 'B': 'MQVersion'}, 'Document': {'XLOutFile': 'TestFile1.xlsx', 'InPath': '/home/me', 'OutPath': '/home/me'}, 'Sheets': [{'Sheet': 'Test123', 'InFile': 'Test123.MQSC', 'Server': 'Testsystem1'}, {'Sheet': 'Test345', 'InFile': 'Test345.MQSC', 'Server': 'Testsystem2'}], 'Title': {'A': 'Server Name', 'C': 'Broker Version', 'B': 'MQ Version'}}
[{'Sheet': 'Test123', 'InFile': 'Test123.MQSC', 'Server': 'Testsystem1'}, {'Sheet': 'Test345', 'InFile': 'Test345.MQSC', 'Server': 'Testsystem2'}]
X
I
O
Test123
Test345
A
C
B
A
C
B

我不知道如何控制数据传递给迭代器的方式。我想要的是将它作为字典传递,以便我可以通过键访问值。这适用于“表格”,但我不明白为什么。文档没有清楚地描述它:http://pyyaml.org/wiki/PyYAMLDocumentation

【问题讨论】:

  • 它的印刷是什么?类型(self.ymldata['Document'])?它对我来说工作正常
  • 你可以试试“for ymlkey in”而不是“for self.ymlkey in”吗?
  • 它并没有真正改变任何东西。数据仍然作为字符串而不是字典从 yamldata 传递到 ymlkey。

标签: python python-2.7 dictionary iterator pyyaml


【解决方案1】:

在您的代码中,self.ymldata['Sheets'] 是一个字典列表,因为您的 YAML 源代码:

  - Sheet: Test123
    InFile: Test123.MQSC
    Server: Testsystem1
  - Sheet: Test345
    InFile: Test345.MQSC
    Server: Testsystem2

是一系列映射(这是 YAML 文件中顶级映射的键 Sheets 的值)。

其他顶级键的值都是映射(而不是映射序列),它们作为 Python dict 加载。如果您像这样做一样迭代dict,您将获得key 值。

如果您不想遍历这些字典,则不应启动 for 循环。您可能想测试顶级键的值是什么,然后采取相应的行动,例如打印出从 YAML 文件加载的所有字典,除了顶级映射:

import ruamel.yaml as yaml

class CfgReader():
    def __init__(self):
        self.stream = ""
        self.ymldata = ""
        self.ymlkey = ""
        self.ymld = ""

    def read(self, infilename):
        self.stream = open(infilename, 'r') # Read the yamlfile
        self.ymldata = yaml.load(self.stream)    # Instanciate yaml object and parse the input "stream".

    def docu(self):
        for k in self.ymldata:
            v = self.ymldata[k]
            if isinstance(v, list):
                for elem in v:
                    print(elem)
            else:
                print(v)

cfg_reader = CfgReader()
cfg_reader.read('in.yaml')
cfg_reader.docu()

哪个打印:

{'InFile': 'Test123.MQSC', 'Sheet': 'Test123', 'Server': 'Testsystem1'}
{'InFile': 'Test345.MQSC', 'Sheet': 'Test345', 'Server': 'Testsystem2'}
{'B': 'MQVersion', 'A': 'ServerName', 'C': 'BrokerVersion'}
{'B': 'MQ Version', 'A': 'Server Name', 'C': 'Broker Version'}
{'XLOutFile': 'TestFile1.xlsx', 'InPath': '/home/me', 'OutPath': '/home/me'}

还请注意一些一般的事情,你应该注意关闭

  • 我使用 ruamel.yaml(免责声明:我是该包的作者),它支持 YAML 1.2(PyYAML 支持 2005 年的 1.1 标准)。出于您的目的,它们的行为相同。
  • 不要使用file()它在Python3中不可用,使用open()
  • 为同一个属性分配两次相同的值是没有意义的 (self.stream = self.stream = ...)
  • 您打开的文件/流永远不会关闭,您可能需要考虑使用

    with open(infilename) as self.stream:
        self.ymldata = yaml.load(self.stream)
    
  • 按照惯例,类名应以大写字符开头。

【讨论】:

    猜你喜欢
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 2012-12-10
    • 1970-01-01
    相关资源
    最近更新 更多