【问题标题】:How to export nested objects from JSON lists in python如何从python中的JSON列表中导出嵌套对象
【发布时间】:2019-03-13 08:57:49
【问题描述】:

我是 MongoDB 和 JSON 格式的新手。我在 MongoDB 集合中有以下 JSON 格式。我想从每个内部对象中获取 value2、value 4 和 value time 并将它们导出到 CSV。此外,每个文档的内部对象的数量可以从 1 到 4 个不等。我怎么能在python中做到这一点?

[{"object":[
    {"value1":number,
     "value2"":number,
     "value3"":number,
     "value4"":"code",
     "value5"":number,
     "value6"":"name"}
     ,
     {"value1":number,
      "value2":number,
      "value3":number,
      "value4":"code",
      "value5":number,
      "value6":"name"}]
     ,
 "time":1550666169274}]"""

【问题讨论】:

  • 您想要的“csv 输出”是什么?你看过 DFS 或 BFS 算法吗?

标签: python json mongodb


【解决方案1】:

欢迎来到 Stack Overflow!

您的格式在语法上不正确。您还应该(根据规则)提供您迄今为止尝试过的示例。你是新人,所以你获得了通行证,但请记住它以备将来使用 =)

你问的不是很清楚。这似乎是两个问题 - 1. 如何访问和捕获数据结构中的数据,2. 如何将捕获的数据写入 csv。

回答第一部分(访问和捕获数据): 你有列表和字典。要访问列表中的值,您可以使用您后面的值的索引号(从 0 开始作为第一个索引号)。

例如如果我有列表l = ['zero', 'one', 'two'],我可以通过l[1] 访问字符串'one',其中1 是列表l 中'one' 的索引号。

要访问字典中的内容,您可以使用它的键。 例如。 d = {'key': 'value'} 使用d['key']获取对应的值-'value'

所以假设你的数据实际上是这样的:

my_json = [
  {
    "object":[
      {
        "value1":1,
        "value2":1,
        "value3":1,
        "value4":"code",
        "value5":1,
        "value6":"name"
      },
      {
        "value1":1,
        "value2":1,
        "value3":1,
        "value4":"code",
        "value5":1,
        "value6":"name"
      }
    ],
    "time":1550666169274
  }
]

您拥有的是一个包含字典的列表; 'object' 键的值是列表,包含字典,而 'time' 键的值是字符串。

所以你可以像这样访问数据:

my_json[0]
>>> {'object': [{'value1': 1, 'value2': 1, 'value3': 1, 'value4': 'code', 'value5': 1, 'value6': 'name'}, {'value1': 1, 'value2': 1, 'value3': 1, 'value4': 'code', 'value5': 1, 'value6': 'name'}], 'time': 1550666169274}

或者,如果您的列表中有多个对象,您可以像这样迭代对象列表,这样很有用):

for i in range(len(my_json)):
  my_json[i]
>>> {'object': [{'value1': 1, 'value2': 1, 'value3': 1, 'value4': 'code', 'value5': 1, 'value6': 'name'}, {'value1': 1, 'value2': 1, 'value3': 1, 'value4': 'code', 'value5': 1, 'value6': 'name'}], 'time': 1550666169274}

my_json[0] 是一个字典 - 因此您可以像这样访问它的值(字典列表):

my_json[0]['object']
>>> [{'value1': 1, 'value2': 1, 'value3': 1, 'value4': 'code', 'value5': 1, 'value6': 'name'}, {'value1': 1, 'value2': 1, 'value3': 1, 'value4': 'code', 'value5': 1, 'value6': 'name'}]

my_json[0]['time']
>>> 1550666169274

这是一个列表,所以再次使用索引:

my_json[0]['object'][0] # or iterate through the list of objects as above
>>> {'value1': 1, 'value2': 1, 'value3': 1, 'value4': 'code', 'value5': 1, 'value6': 'name'}

给你一本字典,所以用它是关键:

my_json[0]['object'][0]['value2']
>>> 1

等等……

由于“每个文档的内部对象的数量可以从 1 到 4 个对象不等”,因此您确实希望遍历“对象”包含的字典列表。你可以这样做:

all_docs = [] # create an empty list to hold further captured data

for obj in range(len(my_json)): # for each 'thing' in this list
  obj_time = my_json[obj]['time'] # grab the time
  values_sought = [] # create an empty list to hold further captured data

  for dictionary in my_json[obj]['object']: # for each 'thing' in the 'object''s list
    val_2 = dictionary['value2'] # grab the necessary values
    val_4 = dictionary['value4']
    values_sought.append((val_2, val_4)) # append them to the empty list above

  print(obj_time, values_sought)
  >>> 1550666169274 [(1, 'code'), (1, 'code')]

  all_docs.append((obj_time, values_sought)) # append each document's data to the all_docs list

print(all_docs)
>>> [(1550666169274, [(1, 'code'), (1, 'code')])]

假设您有两个文档(在顶层),all_docs 看起来像这样:

[(1550666169274, [(1, 'code'), (1, 'code')])
 (1550666169275, [(1, 'code'), (1, 'code')]),]

现在你可以像这样遍历这个列表和元组:

document_1 = all_docs[0]
document_1_data_all = all_docs[1]
document_1_data_1 = all_docs[1][0] # (or iterate)

document_2 = all_docs[1]

...等

对于第二部分,写入 csv,这取决于您希望它的格式。我建议你看看 python 的内置 csv module

希望有帮助

【讨论】:

  • 非常感谢。我用你的详细回答做到了。
猜你喜欢
  • 1970-01-01
  • 2020-05-15
  • 2011-09-29
  • 1970-01-01
  • 2020-05-27
  • 2021-12-10
  • 2017-11-17
  • 2022-01-07
  • 2021-05-13
相关资源
最近更新 更多