2012-10-22 19 views
8

में कनवर्ट करना मुझे YAML फ़ाइल में 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 में
  • नज़र 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() का प्रयास किया, जो काम करने लगता है लेकिन मेरा मुख्य मुद्दा अभी भी मौजूद है।

+3

कृपया किसी और चीज़ के लिए 'dict' का नाम बदलें। यह बुरा बुरा है।साथ ही, क्या आप 'yaml.load_all (स्ट्रीम) 'के मान को प्रिंट कर सकते हैं ताकि हम देख सकें कि आपके पास वास्तव में क्या है? अंत में, ऐसा प्रतीत नहीं होता है कि आपने एक अच्छा YAML नमूना शामिल किया है - जहां एकाधिक सर्वर परिभाषित किए गए हैं? – gahooa

+0

मैं इसका नाम बदलूंगा, सर्वोत्तम अभ्यास के लिए धन्यवाद। yaml_load_all (स्ट्रीम) दिखाता है: <जनरेटर ऑब्जेक्ट load_all 0x10b2648c0> पर। मैंने समस्या निवारण के लिए दूसरा दस्तावेज़ हटा दिया। –

+0

कोड में कौन सी लाइब्रेरी/मॉड्यूल का उपयोग किया जाता है? मुझे लगता है कि यह आयात कथन जोड़ने के लिए इस प्रश्न को बेहतर करेगा, ताकि जो लोग इस प्रश्न को ढूंढ सकें उन्हें इसके लिए खोज नहीं करना पड़ेगा और संभावित रूप से कई संभावित खोज पाएंगे। – Zelphir

उत्तर

13

मुझे लगता है कि अपने 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 
+0

हम्म, मैंने कोशिश की लेकिन मुझे ऊपर इस्तेमाल किए गए यम का उपयोग करके एक ही परिणाम नहीं मिलता है: https://gist.github.com/3934903 –

+0

@zippy यह यम फ़ाइल कहां से आ रही है? –

+0

चूंकि 'yaml' नामक कोई अंतर्निहित मॉड्यूल नहीं है, और उस नाम के साथ एक से अधिक तृतीय-पक्ष लाइब्रेरी है, समस्या यह हो सकती है कि आप उत्तर से एक अलग पुस्तकालय का उपयोग कर रहे हैं। मैंने सत्यापित किया कि PyyAML 3.10, libyaml 0.1.4 के साथ शुद्ध-पायथन दोनों, उत्तर @ जोनक्लेमेंट्स शो देता है, और यह सरल 3.00 करता है। हो सकता है कि आपके पास टूटी हुई लाइब्रेरी है (जो यह भी समझा सकती है कि आप टूटी हुई यमल को पहली जगह क्यों पार्स करने का प्रयास कर रहे हैं?)। – abarnert

2

अपने कोड में एक अतिरिक्त बग, YAML से कोई लेना देना नहीं है:

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

in एक ऑपरेटर कि sequence types पर काम करता है, और यह भी नक्शे पर। यही कारण है कि यह एक वाक्यविन्यास त्रुटि नहीं है ... लेकिन यह वही नहीं करता जो आप चाहते हैं।

key in dict हमेशा True का मूल्यांकन करेगा, क्योंकि आप जिस कुंजी को पुनरावृत्त कर रहे हैं वह ताना में है। तो आपका कोड True == "instanceId" तक उबाल जाता है, जो हमेशा False का मूल्यांकन करेगा, क्योंकि बूलियन मान True उस स्ट्रिंग के बराबर कभी नहीं होता है।

आपने देखा होगा कि print कथन कोई आउटपुट नहीं बनाता है; ऐसा इसलिए है क्योंकि इसे कभी नहीं बुलाया जाता है।