2016-08-03 53 views
4

我用以下YAML數據:pyyaml 3.11將字典傳遞給迭代器?

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

+0

什麼打印? type(self.ymldata ['Document'])?它的工作對我來說很好 –

+0

你可以嘗試「爲ymlkey in」而不是「for self.ymlkey in」? –

+0

它不會改變任何東西。數據仍然作爲字符串從yamldata傳遞到ymlkey,而不是字典。 – crashdog

回答

2

在你的代碼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) 
    
  • 按照慣例,類名應該以大寫字母開頭。