【问题标题】:Python: cycling/scanning though fields in an objectPython:循环/扫描对象中的字段
【发布时间】:2017-03-11 17:09:44
【问题描述】:

我有一个名为 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']

...

【问题讨论】:

  • 谢谢帕德莱克和 E.Gordon。你的帖子很有帮助。我认为我可以从那里解决问题,但在试图使我的原始帖子尽可能简洁时,我担心我过度简化了 JSON 数据示例。我编辑了我的原始帖子以添加新信息。感谢您的帮助。

标签: python json


【解决方案1】:

您可以打印字典中的项目:

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)

这为您提供了关键/内部 dict 配对:

randomName1 {'B': 20, 'A': 16, 'C': 71}
randomName2 {'B': 17, 'A': 12, 'C': 47}

如果你想要内部字典中的值,你可以添加另一个循环

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

如果您有任意级别的嵌套,我们将不得不递归地进行。

【讨论】:

    【解决方案2】:

    您可以使用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"]))
    

    【讨论】:

      猜你喜欢
      • 2014-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 2016-02-06
      • 2012-09-27
      相关资源
      最近更新 更多