通过data = json.load(fp)
从文件加载json后,我想迭代json中的所有项目,当然不包括所有特殊的Python符号。
这怎么做得好?
答案 0 :(得分:11)
data
应该是一个普通的集合,因此您可以像迭代任何其他列表/字典/其他任何方式一样迭代它。来自load
的事实并不会对您产生任何额外的要求。
这是一个使用loads
的示例,原则上类似:
import json
my_json_data = "[1,2,3]"
data = json.loads(my_json_data)
for item in data:
print(item)
结果:
1
2
3
编辑:如果您要问"如何迭代所有我的数据中的值,包括深层嵌套集合中包含的值?",然后你可以这样做:
import json
my_json_data = """[
1,
{
"2": 3,
"4": [
"5",
"6",
"7"
]
},
8,
9
]"""
def recursive_iter(obj):
if isinstance(obj, dict):
for item in obj.values():
yield from recursive_iter(item)
elif any(isinstance(obj, t) for t in (list, tuple)):
for item in obj:
yield from recursive_iter(item)
else:
yield obj
data = json.loads(my_json_data)
for item in recursive_iter(data):
print(item)
结果:
1
5
6
7
3
8
9
编辑:您还可以跟踪导航到每个值所需的密钥,方法是将它们传递给递归调用,并在传递它们时向集合添加新密钥。
def recursive_iter(obj, keys=()):
if isinstance(obj, dict):
for k, v in obj.items():
yield from recursive_iter(v, keys + (k,))
elif any(isinstance(obj, t) for t in (list, tuple)):
for idx, item in enumerate(obj):
yield from recursive_iter(item, keys + (idx,))
else:
yield keys, obj
data = json.loads(my_json_data)
for keys, item in recursive_iter(data):
print(keys, item)
结果:
(0,) 1
(1, '2') 3
(1, '4', 0) 5
(1, '4', 1) 6
(1, '4', 2) 7
(2,) 8
(3,) 9