Python:循环/扫描对象

时间:2016-03-21 22:48:56

标签: python json

我有一个名为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,...
.
.
.

感谢您的帮助。

-

----------------- 3/23/16更新如下--------------

再次感谢您的帮助。这就是我最终提出的。它做我需要的:

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

...

2 个答案:

答案 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"]))