2012-10-22 138 views
8

我遇到了將YAML文件內的文檔映射到dict並正確映射它們的問題。將YAML文件轉換爲python字典

我有以下YAML文件,它代表了服務器(db.yml):

instanceId: i-aaaaaaaa 
    environment:us-east 
    serverId:someServer 
    awsHostname:ip-someip 
    serverName:somewebsite.com 
    ipAddr:192.168.0.1 
    roles:[webserver,php] 

我加載這個YAML文件,我可以沒有任何問題呢,我想我理解這一點。

instanceId = getInstanceId() 
stream = file('db.yml', 'r') 
dict = yaml.load_all(stream) 

for key in dict: 
    if key in dict == "instanceId": 
     print key, dict[key] 

我想的邏輯類似下面的工作:

  • 負載YAML,地圖與dict
  • 看在文檔中的每個字典,如果instanceId比賽是哪設置通過getInstanceId(),然後打印出該文檔的所有鍵和值。

如果我看在命令行中的地圖數據結構,我得到:

{'instanceId': 'i-aaaaaaaa environment:us-east serverId:someServer awsHostname:ip-someip serverName:someserver ipAddr:192.168.0.1 roles:[webserver,php]'} 

我想我可能不正確地創建了YAML文件中的數據結構,以及匹配的內容dict,我有點失落。

附註:我無法使用yaml.load()加載此文件中的所有文檔,我試過yaml.load_all(),這似乎可行,但我的主要問題仍然存在。

+3

請將'dict'重命名爲其他名稱。這是壞的。另外,你可以打印'yaml.load_all(stream)'的值,以便我們可以看到你實際上有什麼?最後,它似乎並沒有包含一個好的YAML示例 - 哪裏定義了多個服務器? – gahooa

+0

我會重命名它,謝謝你的最佳做法。 yaml_load_all(流)顯示:<生成器對象load_all在0x10b2648c0>。我刪除了第二個文檔進行故障排除。 –

+0

代碼中使用了什麼庫/模塊?我認爲這會改進這個問題來添加導入語句,以便發現此問題的人不必搜索它並可能找到多個可能的問題。 – Zelphir

回答

13

我覺得你的YAML文件應該是這樣的(或至少類似,所以它的結構正確反正):

instance: 
    Id: i-aaaaaaaa 
    environment: us-east 
    serverId: someServer 
    awsHostname: ip-someip 
    serverName: somewebsite.com 
    ipAddr: 192.168.0.1 
    roles: [webserver,php] 

然後,yaml.load(...)回報:

{'instance': {'environment': 'us-east', 'roles': ['webserver', 'php'], 'awsHostname': 'ip-someip', 'serverName': 'somewebsite.com', 'ipAddr': '192.168.0.1', 'serverId': 'someServer', 'Id': 'i-aaaaaaaa'}} 

而且你可以從去那裏...


所以使用像:

>>> for key, value in yaml.load(open('test.txt'))['instance'].iteritems(): 
    print key, value 


environment us-east 
roles ['webserver', 'php'] 
awsHostname ip-someip 
serverName somewebsite.com 
ipAddr 192.168.0.1 
serverId someServer 
Id i-aaaaaaaa 
+0

嗯,我試過這個,但我沒有得到相同的結果使用上面使用的yaml: https://gist.github.com/3934903 –

+0

@zippy這個yaml文件來自哪裏? –

+0

由於沒有名爲'yaml'的內置模塊以及多個具有該名稱的第三方庫,因此問題可能是您使用的庫不是來自答案的庫。我證實PyYAML 3.10,純Python和libyaml 0.1.4都給出了@JonClements顯示的答案,simpleyaml 3.10也是如此。也許你有一個破碎的庫(這也可以解釋你爲什麼試圖解析破碎的yaml?)。 – abarnert

2

在你的代碼的附加錯誤,不具有與YAML做:

for key in dict: 
    if key in dict == "instanceId": # This doesn't do what you want 
     print key, dict[key] 

in是,在sequence types工作的操作,還取決於地圖。這就是爲什麼這不是一個語法錯誤...但它不會做你想要的。

key in dict將始終評估爲True,因爲所有正在迭代的鍵都在字典中。因此,您的代碼歸結爲True == "instanceId",它始終計算爲False,因爲布爾值True永遠不會等於該字符串。

您可能已經注意到print語句不會產生任何輸出;這是因爲它永遠不會被調用。