在python中打印json文件的所有键

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/33466450/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-19 13:24:14  来源:igfitidea点击:

print All the keys of a json file in python

pythonjsonkey

提问by akira

I have a folder where I have around 20000 JSON files. I want to find out all the unique keys of each JSON and I want take an union of all the keys. However, I got stuck in the initial step only. I am able to find the keys of a single JSON file.

我有一个文件夹,里面有大约 20000 个 JSON 文件。我想找出每个 JSON 的所有唯一键,我想对所有键进行联合。但是,我只停留在初始步骤。我能够找到单个 JSON 文件的键。

I have wrote the following code till now:

到目前为止,我已经编写了以下代码:

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)

It is giving me an error as follows:

它给了我如下错误:

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

My JSON is a nested json. Please suggest me how can I get all the keys.

我的 JSON 是一个嵌套的 json。请建议我如何获得所有钥匙。

{
"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"
} //, ...
}

回答by Mike Covington

Instead of for key, value in jdata:, use for key, value in jdata.items():like this:

而不是for key, value in jdata:for key, value in jdata.items():像这样使用:

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

Take a look at the docsfor dict:

看看dict的文档

items():

Return a new view of the dictionary's items ((key, value) pairs).

项目()

返回字典项((键,值)对)的新视图。

EDIT:If you want to get all of the nested keys and not just the top level ones, you could take an approach like those suggested in another answerlike so:

编辑:如果您想获取所有嵌套键,而不仅仅是顶级键,您可以采用类似于另一个答案中建议的方法,如下所示:

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']

回答by Vipul

You should use either dict.items()or dict.iteritems()in for key, value in jdata

您应该使用dict.items()dict.iteritems()for key, value in jdata

So, it should be either

所以,它应该是

for key, value in jdata.items():

OR

或者

for key, value in jdata.iteritems():

for python3 and python2 respectively.

分别用于 python3 和 python2。

See answers on this question to know the difference between the two: What is the difference between dict.items() and dict.iteritems()?

请参阅此问题的答案以了解两者之间的区别:dict.items() 和 dict.iteritems() 之间有什么区别?

If you only need to iterate over keys of the dictionary, you can even try dict.keys()or dict.iterkeys()

如果您只需要遍历字典的键,您甚至可以尝试dict.keys()dict.iterkeys()