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]
_
ロジックを次のように動作させたい:
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()
を試してみました。
あなたの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
に評価されます。これは、繰り返し処理するすべてのキーが辞書にあるためです。したがって、コードはTrue == "instanceId"
。ブール値False
はその文字列と決して等しくないため、常にTrue
に評価されます。
print
ステートメントは出力を生成しないことに気づいたかもしれません。これは、呼び出されないためです。