2013-12-17 49 views
3

我想在解析這個代碼片段的JSON文件和打印source讀取一個JSON文件和編碼問題

{ 
     "trailers": { 
      "quicktime": [], 
      "youtube": [ 
       { 
        "source": "mmNhzU6ySL8", 
        "type": "Trailer", 
        "name": "Trailer 1", 
        "size": "HD" 
       }, 
       { 
        "source": "CPTIgILtna8", 
        "type": "Trailer", 
        "name": "Trailer 2", 
        "size": "Standard" 
       } 
      ], 
      "id": 27205 
     }, 

我寫了這個代碼:

for item in j:   
     if item['trailers']: 
      e = item['trailers'] 
      for k,value in e.iteritems(): 
       if k == "youtube": 
        for innerk, innerv in k.iteritems(): 
         if innerk == "source" : 
          print innerv 

可惜我不能解決此錯誤:

for innerk, innerv in k.iteritems(): 

AttributeError: 'unicode' object has no attribute 'iteritems' 
+0

您是否嘗試過Python的[JSON](http://docs.python.org/2/library/json.html)圖書館? – SethMMorton

回答

7

假設JSON格式正確,問題是您的代碼包含此檢查:

if k == "youtube": 
    for innerk, innerv in k.iteritems(): 

既然你剛纔問的k"youtube"(的strunicode一個實例),它不會是有意義的預期k有一個iteritems方法。

我相信,而不是在預期相關dict將有k一起走,這樣的事情:

if k == "youtube": 
    for innerk, innerv in value.iteritems(): 

我從你的JSON注意到,雖然,它看起來像你應該期待多dict要加載的變量爲list -type值爲k == "youtube"時的情況。在這種情況下,你需要先遍歷這些元素,要求每個人的iteritems分開:

if k == "youtube": 
    for each_dict in value: 
     for innerk, innerv in each_dict.iteritems(): 

或類似的規定。最終的完整代碼如下:

for item in j:   
    if item['trailers']: 
     e = item['trailers'] 
     for k,value in e.iteritems(): 
      if k == "youtube": 
       for each_dict in value: 
        for innerk, innerv in each_dict.iteritems(): 
         if innerk == "source" : 
          print innerv 

除了第一個位的問題,你也應該看看的dict類型的內置方法get,它可以讓你安全地從字典中獲得的物品和處理他們優雅地缺失的情況。在你的代碼中,當你說if item['trailers']:這可能不符合你的期望。

首先,如果trailers不是字典的關鍵字,它將生成一個KeyError而不是跳過該條件塊。其次,如果在bool上下文中爲鍵值trailers存儲的值的值爲False,則即使您想要以不同的方式處理它,條件塊也會被跳過(例如,假設None是一個標記值,是在這種情況下trailers沒有數據,但它要記錄一個特定的錯誤是由於。

同時,如果它只是一個空dict那麼這是否意味着你應該直接跳過了條件塊)。這在一次性的數據挖掘中可能並不重要,但總的來說,自動調整以避免這些類型的陷阱是很好的,特別是當內置類型本身使得它更容易處理更優雅的事情時。

鑑於這一切,一個更Python的方法可能如下:

for item in j:  
    y_tube = item.get('trailers', {}).get("youtube", []) 
    for each_dict in y_tube: 
     print each_dict.get("source", "Warning: no entry found for 'source'") 
+0

我有這樣的:'AttributeError:'列表'對象沒有屬性'iteritems'',我試圖修復它。 – 4m1nh4j1

+0

這就是我的中間更新涵蓋的內容。請注意,「youtube」的JSON是一個包含兩個字典的「list」。它不僅僅是一本字典。所以'價值'將是一個'列表'。這意味着你還需要遍歷那些'list'元素(我在我的答案中寫到「'for each_dict in value:'」的部分),並且只有* then *最終可以在最內層循環中打印數據存儲在關鍵''源'''處。 – ely

2

看這句話:

for k,value in e.iteritems() 

所以很明顯,k是一個關鍵(在一個Unicode字符串你案件)。你清楚地知道這一點,你的比較if k == "youtube"
Unicode字符串沒有iteritems()方法。

我有一種感覺,你要找的東西是這樣的:

for k,value in e.iteritems() 
    for innerk,innerv in value.iteritems(): 
     # do stuff 
+0

爲什麼downvote? – inspectorG4dget