2017-11-19 11 views
0

からの解析データを、私はのPython:Pythonでロジック以下でYAMLファイル

- gms: 
    - localhost1: 
     address: 192.168.56.101 
     username: root 
     password: xxxxxx 
     command: "uptime" 
     hostname: mydev_machine 

以下のようにYAMLデータを持っていると私はaddresspasswordcommandの値を抽出しようとしています、hostname

import yaml 

with open("host_data.yaml",'r') as stream : 
    data_loaded = yaml.load(stream) 

for element in data_loaded: 
    address=element['gms']['localhost1']['address'] 
    username=element['gms']['localhost1']['username'] 
    password=element['gms']['localhost1']['password'] 
    hostname=element['gms']['localhost1']['hostname'] 

print(data_loaded)出力

[{'gms': [{'localhost1': {'address': '192.168.56.101', 'username': 'root', 'password': 'xxxxxx', 'command': 'uptime', 'hostname': 'mydev_machine'}}]}] 

私は

Traceback (most recent call last): 
    File "Python_Programs/log_finder.py", line 12, in <module> 
    address=element['gms']['localhost1']['address'] 
TypeError: list indices must be integers or slices, not str 
+0

'' data_loaded = yaml.load(ストリーム) ''後の印刷(data_loaded)の出力は何ですか?まず基本的なデバッグを行うべきです。また、 '' gms''キーがどこから来るのかは明確ではありません。 – roganjosh

+0

@roganjosh、更新しました。 'gms'を' dev'に変更しました。 –

答えて

2

element.get('gms')またはelement['gms']などのエラーを取得していますが、リストを生成します。リストを反復する必要があります。

for element in data_loaded: 
    for item in element.get('gms'): 
     print(item.get('localhost1').get('address')) 

ます。また、このようなlistの要素にアクセスすることができます

element['gms'][0]['localhost1']['address'] 
+0

作業中。だから[0]はインデックス[0]の辞書を示していますか? –

+1

はい。 '' {{'localhost1':{'address': '192.168.56.101'、 'username': 'root'、 'password': 'ramaram'、 'command': 'uptime'、 'hostname' : 'mydev_machine'}}] 'リスト。インデックス番号を使用する代わりに、リストを反復することをお勧めします。 –

関連する問題