簡體   English   中英

將 YAML 文件轉換為 python dict

[英]Converting YAML file to python dict

我在將 YAML 文件中的文檔映射到dict並正確映射它們時遇到以下問題。

我有以下 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
  • 查看文檔中的每個字典,如果instanceIdgetInstanceId()設置的匹配,則打印出該文檔的所有鍵和值。

如果我從命令行查看地圖數據結構,我會得到:

{'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() ,這似乎有效,但我的主要問題仍然存在。

我認為你的 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

代碼中的另一個錯誤,與 YAML 無關:

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

in是一個適用於序列類型和映射的運算符。 這就是為什么這不是語法錯誤......但它沒有做你想要的。

key in dict將始終評估為True ,因為您迭代的所有鍵都在 dict 中。 所以你的代碼歸結為True == "instanceId" ,它總是評估為False ,因為布爾值True永遠不等於該字符串。

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

只需使用python-benedict ,它是一個 dict 子類,為大多數常見格式提供 I/O 支持,包括yaml

from benedict import benedict

# path can be a yaml string, a filepath or a remote url
path = 'path/to/data.yml'

d = benedict.from_yaml(path)

# do stuff with your dict
# ...

# write it back to disk
d.to_yaml(filepath=path)

它經過了良好的測試和記錄,請查看自述文件以查看所有功能: https : //github.com/fabiocaccamo/python-benedict

使用 pip pip install python-benedictpip install python-benedict

注意:我是這個項目的作者

您可以使用 Python3 的bios包,如下所示:

import bios

my_dict = bios.read('data.yml')

bios正在從文件中讀取原始數據並轉換 python dict 對象。 根據文件的擴展名,可以判斷文件類型。

如果您在嘗試弄清楚如何使用 pyyaml 庫從 yaml 文件中獲取 python 字典時遇到了這個問題,請嘗試如下所示的safe_load選項。

import yaml
dict = yaml.safe_load("data.yml")

我喜歡使用 Path,做一個漂亮的單線

import yaml
from pathlib import Path
conf = yaml.safe_load(Path('data.yml').read_text())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM