web-dev-qa-db-ja.com

YAMLファイルをpython dictに変換する

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にマップする
  • 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()を試してみました。

28
Zippy Zeppoli

あなたの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
_
31
Jon Clements

コードの追加のバグ。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に評価されます。これは、繰り返し処理するすべてのキーが辞書にあるためです。したがって、コードはTrue == "instanceId"。ブール値Falseはその文字列と決して等しくないため、常にTrueに評価されます。

printステートメントは出力を生成しないことに気づいたかもしれません。これは、呼び出されないためです。

3
Michael Scheper