python 迭代 json 文件,其中 json 结构和键值未知
python iterate json file where the json structure and key values are unknown
考虑下面的示例 JSON。
{
"widget": {
"test": "on",
"window": {
"title": "myWidget1",
"name": "main_window"
},
"image": {
"src": "Images/wid1.png",
"name": "wid1"
}
},
"os":{
"name": "ios"
}
}
考虑我们不知道 JSON 和任何键的结构的情况。我需要实现的是一个 python 函数,它遍历所有键和子键并打印键。也就是说,只知道 JSON 文件名,我应该能够迭代整个键和子键。 JSON 可以是我尝试过的任何 structure.What,如下所示。
JSON_PATH = "D:\workspace\python\sampleJSON.json"
os.path.expanduser(JSON_PATH)
def iterateAllKeys(e):
for key in e.iterkeys():
print key
for child in key.get(key):
iterateAllKeys(child)
with open(JSON_PATH) as data_file:
data = json.load(data_file)
iterateAllKeys(data)
在这里,iterateAllKeys() 函数应该打印 JSON 文件中存在的所有键。但是如果只有外循环存在,即
def iterateAllKeys(e):
for key in e.iterkeys():
print key
它将打印键 "widget" 和 "os"。但是,
def iterateAllKeys(e):
for key in e.iterkeys():
print key
for child in key.get(key):
iterateAllKeys(child)
returns 错误 - AttributeError:'unicode' 对象没有属性 'get'。我的理解是——由于 'child' 的值不是字典对象,我们不能应用 'key.get()'。但是有没有其他方法可以在不指定任何键名的情况下迭代 JSON 文件。谢谢。
您可以通过 flatten_json.
等辅助包来完成此操作
pip install flatten_json
from flatten_json import flatten
for key in flatten(your_dict).keys():
print(key)
输出:
widget_test
widget_window_title
widget_window_name
widget_image_src
widget_image_name
os_name
如果你想只显示键而不显示整个路径,那么你可以这样做:
print(key.split('_')[-1])
您可以像这样使用递归遍历多级字典:
def iter_dict(dic):
for key in dic:
print(key)
if isinstance(dic[key], dict):
iter_dict(dic[key])
迭代第一个字典的键并打印每个键,如果该项目是dict的实例class,我们可以使用递归来迭代我们遇到的字典作为项目。
首先是你的最后一个函数:
def iterateAllKeys(e):
for key in e.iterkeys():
print key
for child in key.get(key):
iterateAllKeys(child)
key 就是字典的key_value。所以如果有的话你应该使用 e.get(key) 或 e[key].
for child in e.get(key):
现在这并不能解决您的问题,一种解决方法是使用 try except,如下所示:
def iterateAllKeys(e):
for key in e.iterkeys():
print key
try:
iterateAllKeys(e[key])
except:
print "---SKIP---"
这可能不是最好的解决方法,但确实有效。
使用您的数据,它会打印以下内容:
widget
test
---SKIP---
window
name
---SKIP---
title
---SKIP---
image
src
---SKIP---
name
---SKIP---
os
name
---SKIP---
考虑下面的示例 JSON。
{
"widget": {
"test": "on",
"window": {
"title": "myWidget1",
"name": "main_window"
},
"image": {
"src": "Images/wid1.png",
"name": "wid1"
}
},
"os":{
"name": "ios"
}
}
考虑我们不知道 JSON 和任何键的结构的情况。我需要实现的是一个 python 函数,它遍历所有键和子键并打印键。也就是说,只知道 JSON 文件名,我应该能够迭代整个键和子键。 JSON 可以是我尝试过的任何 structure.What,如下所示。
JSON_PATH = "D:\workspace\python\sampleJSON.json"
os.path.expanduser(JSON_PATH)
def iterateAllKeys(e):
for key in e.iterkeys():
print key
for child in key.get(key):
iterateAllKeys(child)
with open(JSON_PATH) as data_file:
data = json.load(data_file)
iterateAllKeys(data)
在这里,iterateAllKeys() 函数应该打印 JSON 文件中存在的所有键。但是如果只有外循环存在,即
def iterateAllKeys(e):
for key in e.iterkeys():
print key
它将打印键 "widget" 和 "os"。但是,
def iterateAllKeys(e):
for key in e.iterkeys():
print key
for child in key.get(key):
iterateAllKeys(child)
returns 错误 - AttributeError:'unicode' 对象没有属性 'get'。我的理解是——由于 'child' 的值不是字典对象,我们不能应用 'key.get()'。但是有没有其他方法可以在不指定任何键名的情况下迭代 JSON 文件。谢谢。
您可以通过 flatten_json.
等辅助包来完成此操作pip install flatten_json
from flatten_json import flatten
for key in flatten(your_dict).keys():
print(key)
输出:
widget_test
widget_window_title
widget_window_name
widget_image_src
widget_image_name
os_name
如果你想只显示键而不显示整个路径,那么你可以这样做:
print(key.split('_')[-1])
您可以像这样使用递归遍历多级字典:
def iter_dict(dic):
for key in dic:
print(key)
if isinstance(dic[key], dict):
iter_dict(dic[key])
迭代第一个字典的键并打印每个键,如果该项目是dict的实例class,我们可以使用递归来迭代我们遇到的字典作为项目。
首先是你的最后一个函数:
def iterateAllKeys(e):
for key in e.iterkeys():
print key
for child in key.get(key):
iterateAllKeys(child)
key 就是字典的key_value。所以如果有的话你应该使用 e.get(key) 或 e[key].
for child in e.get(key):
现在这并不能解决您的问题,一种解决方法是使用 try except,如下所示:
def iterateAllKeys(e):
for key in e.iterkeys():
print key
try:
iterateAllKeys(e[key])
except:
print "---SKIP---"
这可能不是最好的解决方法,但确实有效。 使用您的数据,它会打印以下内容:
widget
test
---SKIP---
window
name
---SKIP---
title
---SKIP---
image
src
---SKIP---
name
---SKIP---
os
name
---SKIP---