我有一个需求,就是将 mongo 的结果通过 python 转换成 csv,但是遇到这类数据结构就不知道怎么处理:
{
"_id": xxxxzx
“ uid ”: 1378914,
"User":[
{
'0':{"is_pay": true,
"product": "清洁器"
},
'1':{"is_pay": true,
"product": "大彩电"
}
}
],
“ is_VIP ”: "",
"last_time": ISODate("xxxxxx")
"history": ["xxxx", "xxxx"]
}
有什么办法能将内嵌的字段的 jkey 转化成CSV
header, 将 list 里面的 value 转换成“ xxx, xxx ”呢?
1
golmic 2017-11-25 20:56:13 +08:00 via Android
额。。这不是很简单么。。你用 python 写个 for 循环
|
2
scriptB0y 2017-11-25 21:01:27 +08:00
用内置的 csv 模块 for 循环输出
|
3
SlipStupig OP |
4
janxin 2017-11-26 05:09:23 +08:00 via iPhone
@SlipStupig 那就遍历两遍…
|
5
faketemp 2017-11-26 08:23:09 +08:00 1
|
7
SlipStupig OP |
8
janxin 2017-11-26 13:28:05 +08:00
@SlipStupig 第一遍取完所有的 key,第二遍填内容,怎么可能不可以?
|
9
SlipStupig OP @janxin 当然不行,如果是内嵌的话, 例如:
{ “ User ”:[ "0":{"is_pay": true, "product": "清洁器" }, "1":{"is_pay": true, "product": "大彩电" }] } 这里面有三层,你一次根本弄不完 |
10
janxin 2017-11-26 14:26:13 +08:00
@SlipStupig 为什么取不完...
|
11
SlipStupig OP @janxin show your code
|
12
allen0125 2017-11-26 20:03:44 +08:00
同样需求的表示持续关注
|
13
yb3712590 2017-11-27 02:22:12 +08:00
keys=set()
for key in a.keys(): ....keys.add(key) for goods in a['User']: ....for good in goods.values(): ........for key in good.keys(): ............keys.add(key) 有了 json 的所有 keys 之后,你再根据这些 key 去找对应的数据填充,User list 有几个成员最后就会产生几行 |
14
SlipStupig OP @yb3712590 感謝你的回答,但是我这个不是一个好主意,因为如果内嵌更多数据后,依然无法全部解压出来,需要写更多的 for 循环
|
15
SlipStupig OP @allen0125 我用的方法,先将 JSON 转成 python dict,然后扁平化,最后用 tablib 去处理。
扁平化代码: def flatten_json(maps, delimiter): """ flatten the Map object :param maps: the map object :param delimiter: the delimiter symbols :return: A new dict object """ val = {} for i in maps.keys(): if isinstance(maps[i], dict): get = flatten_json(maps[i], delimiter) for j in get.keys(): val[i + delimiter + j] = get[j] elif isinstance(maps[i], (tuple, list)): if maps[i]: for item_seq in xrange(len(maps[i])): item = maps[i][item_seq] if not item: continue elif isinstance(item, (str, unicode)): val[i] = ';'.join(maps[i]) break elif isinstance(item, dict): for j in item.keys(): val[i + delimiter + j+':'+str(item_seq)] = item[j] else: val[i] = None else: val[i] = maps[i] return val |
16
levelworm 2020-07-29 01:48:52 +08:00 via Android
需要所有的 key 么?如果有固定列表就好了,不过看了下评论好像没有。
|