59

YAML ファイル内のドキュメントを にマッピングし、dictそれらを適切にマッピングするという次の問題があります。

db.ymlサーバー ( )を表す次の YAML ファイルがあります。

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 にマップする
  • ドキュメント内のすべての 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()

4

6 に答える 6

55

あなたの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
于 2012-10-22T21:40:30.037 に答える
2

私はPathを使うのが大好きで、美しいワンライナーを作ります

import yaml
from pathlib import Path
conf = yaml.safe_load(Path('data.yml').read_text())
于 2021-12-26T18:18:21.797 に答える