Pyyaml3.11将字典传递给迭代器?

2024-10-03 19:28:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用以下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

以及以下代码:

^{pr2}$

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


Tags: homeserverversiondocumentinfilesheetmeoutpath
1条回答
网友
1楼 · 发布于 2024-10-03 19:28:32

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

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

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

其他顶级键的值都是映射(而不是映射序列),它们作为Pythondict加载。如果你像你一样迭代一个dict,你会得到key值。在

如果您不想迭代这些字典,那么就不应该启动for循环。您可能需要测试顶级键的值,然后相应地进行操作,例如,打印出从YAML文件加载的所有字典(顶层映射除外)如下:

^{pr2}$

哪个打印:

{'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'}

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

  • 我使用拉梅尔亚姆勒(免责声明:我是该包的作者),它支持yaml1.2(PyYAML支持2005年的1.1标准)。为了你的目的,他们的行为是一样的。在
  • 不要使用file()它在Python3中不可用,请使用open()
  • 将相同的值两次分配给同一属性没有意义(self.stream = self.stream = ...
  • 打开的文件/流永远不会关闭,您可能需要考虑使用

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

相关问题 更多 >