我有一个名为MyFile.json的JSON文件,其中包含以下结构:
[{u'randomName1': {u'A': 16,u'B': 20,u'C': 71},u'randomName2': {u'A': 12,u'B': 17,u'C': 47}},...]
我可以打开文件并加载它:
import json
with open('MyFile.json') as data_file:
data = json.load(data_file)
我可以像这样访问第一个元素中的值:
data[0]["randomName1"][A]
data[0]["randomName1"][B]
data[0]["randomName1"][C]
data[0]["randomName2"][A]
data[0]["randomName2"][B]
data[0]["randomName2"][C]
A B C键总是命名为A B C(并且总是有3个,所以没问题。
问题是: 1)我不知道列表中有多少元素,并且 2)我不知道每个元素中有多少“randomName”键,并且 3)我不知道randomName键的名称。
如何扫描/循环浏览整个文件,获取所有元素,并获取每个元素的所有键名和关键键值?
我没有编写自己的复杂解析脚本的知识或愿望。我期待json库有一种方法可以提供这些信息。
例如(这不是我认识到的完美类比)如果我在AWK中获得一个数组X,我可以使用
扫描所有索引/名称对for(index in X){print index, X[index]);
Python中有这样的东西吗?
----------------此行下面的新信息-------------
谢谢Padraic和E.Gordon。这对解决问题大有帮助。
为了让我的初始帖子尽可能简洁,我过多地简化了我的JSON数据示例。
我的JSON数据实际上是这样的:
data=[
{ {u'X': u'randomName1': {u'A': 11,u'B': 12,u'C': 13}, u'randomName2': {u'A': 21,u'B': 22,u'C': 23}, ... }, u'Y': 101, u'Z': 102 },
.
.
.
]
椭圆表示任意重复,如原始帖子中所述。 X Y Z键总是命名为X Y Z(并且总是正好有3个)。
以帖子作为起点,我已经花了几个小时研究这个问题,但是对Python不熟悉我很难过。我无法弄清楚如何添加额外的循环来处理这些数据。我希望输出流看起来像这样:
Z,102,Y,101,randomName1,A,11,B,12,C,13,randomName2,A,21,B,22,C,23,...
.
.
.
感谢您的帮助。
-
再次感谢您的帮助。这就是我最终提出的。它做我需要的:
import json
with open('MyFile.json') as data_file:
data = json.load(data_file)
for record in data:
print record['Z'],record['Y']
for randomName in record['X']:
print randomName, randomName['A'], randomName['B'],randomName['C']
...
答案 0 :(得分:3)
您可以在dicts中打印项目:
js = [{u'randomName1': {u'A': 16,u'B': 20,u'C': 71},u'randomName2': {u'A': 12,u'B': 17,u'C': 47}}]
for dct in js:
for k, v in dct.items():
print(k, v)
它为您提供键/内部词典配对:
randomName1 {'B': 20, 'A': 16, 'C': 71}
randomName2 {'B': 17, 'A': 12, 'C': 47}
如果你想要内部dicts的值,你可以添加另一个循环
for dct in js:
for k1, d in dct.items():
print(k1)
for k2,v in d.items():
print(k2,v)
哪个会给你:
randomName1
A 16
B 20
C 71
randomName2
A 12
B 17
C 47
如果你有任意级别的嵌套,我们将不得不递归地进行。
答案 1 :(得分:1)
您可以使用for element in list
构造循环遍历列表中的所有元素without having to know its length。
iteritems()字典方法提供了一种从字典中获取键值对的便捷方法,同样无需知道有多少键或调用键。
例如:
import json
with open('MyFile.json') as data_file:
data = json.load(data_file)
for element in data:
for name, values in element.iteritems():
print("%s has A=%d, B=%d and C=%d" % (name,
values["A"],
values["B"],
values["C"]))