2015-11-01 5 views
5

私は約20000の息子ファイルを持っているフォルダを持っています。私は各jsonのすべてのユニークなキーを見つけたいと思います、そして私はすべてのkeys.But最初のステップだけで立ち往生しました。私は単一の息子のファイルの鍵を見つけることができました。print pythonでjsonファイルのすべてのキー

from pprint import pprint 
import json 
json_data=open("/Users/akira/out/1.json") 
jdata = json.load(json_data) 

for key, value in jdata: 
    pprint("Key:") 
    pprint(key) 

次のようにそれは私にエラーを与えている:私は今まで、次のコードを書いている

Traceback (most recent call last): 
File "/Users/akira/PycharmProjects/csci572/linkedbased.py",  line 8, in <module> 
    for key, value in jdata: 
ValueError: need more than 1 value to unpack 

私のJSONはネストされたjson.Pleaseですが、私は得ることができますどのように私を示唆しますすべてのキー。代わりにfor key, value in jdata:

{ 
"a": "Offer", 
"inLanguage": "et", 
"availabl": { 
    "a": "Place", 
    "address": { 
     "a": "PostalAddress", 
     "name": "Oklahoma" 
    } 
}, 
"description": "Smith and Wesson 686 357 magnum 6 inch barrel wood handle great condition shoots great.", 
"priceCurrency": "USD", 
"geonames_address": [ 
    { 
     "a": "PopulatedPlace", 
     "hasIdentifier": { 
      "a": "Identifier", 
      "label": "4552707", 
      "hasType": "http://dig.isi.edu/gazetteer/data/SKOS/IdentifierTypes/GeonamesId" 
     }, 
     "hasPreferredName": { 
      "a": "Name", 
      "label": "Tahlequah" 
     }, 
     "uri": "http://dig.isi.edu/gazetteer/data/geonames/place/4552707", 
     "fallsWithinState1stDiv": { 
      "a": "State1stDiv", 
      "uri": "http://dig.isi.edu/gazetteer/data/geonames/place/State1stDiv/US_OK", 
      "hasName": { 
       "a": "Name", 
       "label": "Oklahoma" 
      } 
     }, 
     "score": 0.5, 
     "fallsWithinCountry": { 
      "a": "Country", 
      "uri": "http://dig.isi.edu/gazetteer/data/geonames/place/Country/US", 
      "hasName": { 
       "a": "Name", 
       "label": "United States" 
      } 
     }, 
     "fallsWithinCountyProvince2ndDiv": { 
      "a": "CountyProvince2ndDiv", 
      "uri": "http://dig.isi.edu/gazetteer/data/geonames/place/CountyProvince2ndDiv/US_OK_021" 
     }, 
     "geo": { 
      "lat": 35.91537, 
      "lon": -94.96996 
     } 
    } 
], 
"price": 750, 
"title": "For Sale: Smith &amp; Wesson 686", 
"publisher": { 
    "a": "Organization", 
    "name": "armslist.com", 
    "uri": "http://dig.isi.edu/weapons/data/organization/armslist" 
}, 
"uri": "http://dig.isi.edu/weapons/data/page/13AD9516F01012C5F89E8AADAE5D7E1E2BA97FF9/1433463841000/processed", 
"seller": { 
    "a": "PersonOrOrganization", 
    "description": "Private Party" 
} //, ... 
} 

答えて

7

、このようなfor key, value in jdata.items():を使用します。

項目()

戻りA

for key, value in data.items(): 
    pprint("Key:") 
    pprint(key) 

はdictのためdocsを見てみましょう辞書の項目の新しいビュー((キー、値)のペア)。

EDIT:あなたは、ネストされたキーだけでなく、トップレベルのもののすべてを取得したい場合は、そのようなanother answerに提案したもののようなアプローチを取ることができます:

def get_keys(dl, keys_list): 
    if isinstance(dl, dict): 
     keys_list += dl.keys() 
     map(lambda x: get_keys(x, keys_list), dl.values()) 
    elif isinstance(dl, list): 
     map(lambda x: get_keys(x, keys_list), dl) 

keys = [] 
get_keys(jdata, keys) 

print(keys) 
# [u'a', u'inLanguage', u'description', u'priceCurrency', u'geonames_address', u'price', u'title', u'availabl', u'uri', u'seller', u'publisher', u'a', u'hasIdentifier', u'hasPreferredName', u'uri', u'fallsWithinState1stDiv', u'score', u'fallsWithinCountry', u'fallsWithinCountyProvince2ndDiv', u'geo', u'a', u'hasType', u'label', u'a', u'label', u'a', u'uri', u'hasName', u'a', u'label', u'a', u'uri', u'hasName', u'a', u'label', u'a', u'uri', u'lat', u'lon', u'a', u'address', u'a', u'name', u'a', u'description', u'a', u'name', usury'] 

print(list(set(keys))) # unique list of keys 
# [u'inLanguage', u'fallsWithinState1stDiv', u'label', u'hasName', u'title', u'hasPreferredName', u'lon', u'seller', u'score', u'description', u'price', u'address', u'lat', u'fallsWithinCountyProvince2ndDiv', u'geo', u'a', u'publisher', u'hasIdentifier', u'name', u'priceCurrency', u'geonames_address', u'hasType', u'availabl', u'uri', u'fallsWithinCountry'] 
1

あなたべきだから、for key, value in jdata

dict.items()またはdict.iteritems()のいずれかを使用し、それが

for key, value in jdata.items(): 
のいずれかでなければなりません

OR

for key, value in jdata.iteritems(): 

両者の違いを知るために、この質問の答えを参照してください。What is the difference between dict.items() and dict.iteritems()?

あなただけの辞書のキーを反復処理する必要がある場合は、あなたもdict.keys()またはdict.iterkeys()

を試すことができます
+0

'.iteritems()'がPython 3で削除されたというメモを追加したかっただけです。 –

+1

oh!時代が変わりつつあります!私はPython 2とPython 3の詳細を学ぶべきです – Vipul

関連する問題