2010-02-15 7 views
22

मैं पाइथन और पार्सिंग डेटा के लिए बहुत नया हूं।पाइथन dict से पढ़ना अगर कुंजी मौजूद नहीं हो सकती है

मैं एक बाहरी JSON फ़ीड को पाइथन शब्दकोश में खींच सकता हूं और शब्दकोश पर फिर से चला सकता हूं।

for r in results: 
    print r['key_name'] 

मैं चल के रूप में के माध्यम से परिणाम प्राप्त नहीं हुए, मैं जब एक महत्वपूर्ण एक मूल्य नहीं है एक त्रुटि हो रही है (एक मूल्य हमेशा एक रिकार्ड के लिए मौजूद नहीं सकता है)। यदि मैं परिणाम प्रिंट करता हूं, तो यह

'key_name': None, 'next_key':................. 

मेरा कोड त्रुटि पर टूट जाता है। मैं एक कुंजी के लिए नियंत्रण कैसे कर सकता हूं?

किसी भी मदद की सराहना की जाएगी!

ब्रॉक

उत्तर

66

पसंदीदा तरीका वापस आ जाएगी, जब लागू:

for r in results: 
    print r.get('key_name') 

यह बस प्रिंट होगा None अगर key_name एक महत्वपूर्ण नहीं है शब्दकोश में। आप किसी भिन्न डिफ़ॉल्ट मान हो सकता है सिर्फ दूसरा तर्क के रूप में इसे पारित:

for r in results: 
    print r.get('key_name', 'Missing: key_name') 

आप कुछ एक डिफ़ॉल्ट मान का उपयोग करने से अलग करना चाहते हैं (जैसे कि, छोड़ मुद्रण पूरी तरह से जब कुंजी अनुपस्थित है) तो आप थोड़ा और संरचना की जरूरत है, यानी, या तो:

for r in results: 
    if 'key_name' in r: 
     print r['key_name'] 

या

for r in results: 
    try: print r['key_name'] 
    except KeyError: pass 

दूसरा एक तेजी से हो सकता है (यदि वह उचित रूप दुर्लभ है की तुलना में एक कुंजी याद आ रही है), लेकिन फाई कई लोगों के लिए आरएसटी अधिक प्राकृतिक प्रतीत होता है।

+0

किसी भी तरह से प्राप्त करने के लिए एक कुंजी के उप कुंजी प्राप्त करने का कोई तरीका है? – brizz

+0

@brizz, "उप कुंजी" क्या है? –

+1

का कहना है कि आपके पास एक निर्देश है, {डेटा: {'moredata': 'value', 'evenmoredata': 'anothervalue'}}, .get ('डेटा') के लिए काम करता है, लेकिन क्या पहुंचने के लिए वैसे भी है .get ('डेटा') ['moredata'] – brizz

0

उपयोग has_key(), और कहा कि सही या गलत

+7

'd.has_key (के)' है अब बहिष्कृत आपको नए कोड में 'k in d' का उपयोग करना होगा। – LeafStorm

0

तुम भी कुछ इस तरह कर सकता है [लापरवाह गलती को दूर करने के लिए अद्यतन]:

for r in (row for row in results if 'a' in row): 
    print r['a'] 

यह एक जनरेटर अभिव्यक्ति का उपयोग करता है "परिणाम" से बाहर "पंक्तियाँ" लेने के लिए जहां "पंक्ति" भी शामिल है कुंजी "ए"।

results = [{'a':True}, {'b':True}, {'a':True}] 
for r in (row for row in results if 'a' in row): print r['a'] 
+0

'[r.get ('key_name')] – bernie

+0

@ पैरांड: पाइथन के किस संस्करण ने आप परीक्षण किया था? आपके 'स्टेटमेंट' दोनों में पाइथन 2.6 और 3.1 में ** SYNTAX ** ** त्रुटि ** खींचा गया है। –

+0

क्षमा करें जॉन, वह एक लापरवाही गलती थी। स्क्रिप्ट फिक्स्ड, अब पाइथन 2.5+ पर काम करना चाहिए। – Parand

1

यदि संभव हो, JSON डेटा के प्रबंधन के लिए simplejson पुस्तकालय का उपयोग करें:

यहाँ एक छोटे से परीक्षण स्क्रिप्ट है।

0

पाइथन dict से पढ़ने के दो सरल तरीके हैं यदि कुंजी मौजूद नहीं हो सकती है।उदाहरण के लिए:

dicty = {'A': 'hello', 'B': 'world'}

  1. एक कुंजी-मान पेयर का उपयोग करने की pythonic तरीका है:

value = dicty.get('C', 'default value')

  1. गैर pythonic रास्ता:

value = dicty['C'] if dicty['C'] else 'default value'

  1. भी बदतर:

try: value = dicty['C'] except KeyError as ke: value = 'default value'

0

आप समारोह में बनाया का उपयोग कर सकते hasattr

key='key_name' 
# or loop your keys 

if hasattr(e, key): 
    print(e[key]) 
else: 
    print('No key for %s' % key) 
संबंधित मुद्दे