pymongo 怎么将查询结果转换成 CSV?

2017-11-25 20:22:52 +08:00
 SlipStupig

我有一个需求,就是将 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 ”呢?

3039 次点击
所在节点    Python
16 条回复
golmic
2017-11-25 20:56:13 +08:00
额。。这不是很简单么。。你用 python 写个 for 循环
scriptB0y
2017-11-25 21:01:27 +08:00
用内置的 csv 模块 for 循环输出
SlipStupig
2017-11-25 21:27:20 +08:00
@golmic
@scriptB0y
问题是内嵌的字段,问题是不确定 key 的名称,这个 schema 长度是不固定的
janxin
2017-11-26 05:09:23 +08:00
@SlipStupig 那就遍历两遍…
faketemp
2017-11-26 08:23:09 +08:00
好吧 看来我要告诉你一个神器了 常见格式数据一键自动转换 数据处理懒人必备库
python 第三方库 Tablib
https://github.com/kennethreitz/tablib
admirez
2017-11-26 11:57:51 +08:00
@faketemp 感谢
SlipStupig
2017-11-26 13:19:03 +08:00
@janxin 你的前提前提是知道有多少嵌套对象,但是我是不知道的,你怎么确定写两遍一定可以呢?

@faketemp 感谢哦,我看看能不能解决
janxin
2017-11-26 13:28:05 +08:00
@SlipStupig 第一遍取完所有的 key,第二遍填内容,怎么可能不可以?
SlipStupig
2017-11-26 13:45:02 +08:00
@janxin 当然不行,如果是内嵌的话, 例如:

{
“ User ”:[
"0":{"is_pay": true,
"product": "清洁器"
},
"1":{"is_pay": true,
"product": "大彩电"
}]
}

这里面有三层,你一次根本弄不完
janxin
2017-11-26 14:26:13 +08:00
@SlipStupig 为什么取不完...
SlipStupig
2017-11-26 14:27:36 +08:00
@janxin show your code
allen0125
2017-11-26 20:03:44 +08:00
同样需求的表示持续关注
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 有几个成员最后就会产生几行
SlipStupig
2017-11-27 09:16:54 +08:00
@yb3712590 感謝你的回答,但是我这个不是一个好主意,因为如果内嵌更多数据后,依然无法全部解压出来,需要写更多的 for 循环
SlipStupig
2017-11-27 09:23:14 +08:00
@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
levelworm
2020-07-29 01:48:52 +08:00
需要所有的 key 么?如果有固定列表就好了,不过看了下评论好像没有。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/409514

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX