Python Pyyaml3.11是否将字典传递给迭代器?
我使用以下YAML数据:Python Pyyaml3.11是否将字典传递给迭代器?,python,python-2.7,dictionary,iterator,pyyaml,Python,Python 2.7,Dictionary,Iterator,Pyyaml,我使用以下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: "S
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
打印
输出为:
{'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
我无法找到如何控制数据传递到迭代器的方式。我想要的是将其作为字典传递,以便通过键访问值。这适用于“床单”,但我不明白为什么。文档没有清楚地描述它:在您的代码中
self.ymldata['Sheets']
是一个字典列表,因为您的YAML源代码:
- Sheet: Test123
InFile: Test123.MQSC
Server: Testsystem1
- Sheet: Test345
InFile: Test345.MQSC
Server: Testsystem2
是一个映射序列(这是YAML文件中顶级映射的键Sheets
)
其他顶级键的值都是映射(而不是映射序列),它们作为Pythondict
加载。如果您像这样迭代一个dict
,就会得到键
值
如果不想迭代这些字典,则不应启动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(免责声明:我是该软件包的作者),它支持yaml1.2(PyYAML从2005年开始支持1.1标准)。为了你的目的,他们的行为是一样的
- 不要使用
它在Python3中不可用,请使用file()
open()
- 将相同的值赋给同一属性两次没有意义(
)self.stream=self.stream=…
<> >您打开的文件/流从未关闭,您可能需要考虑使用
with open(infilename) as self.stream:
self.ymldata = yaml.load(self.stream)
它的印刷品是什么?类型(self.ymldata['Document'])?这对我来说很好,你可以试着“为ymlkey in”而不是“为self.ymlkey in”?这并没有改变任何事情。数据仍然作为字符串而不是字典从yamldata传递到ymlkey。