V2EX 首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
V2EX  ›  Python

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

  •  
  •   SlipStupig · 89 天前 · 827 次点击
    这是一个创建于 89 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    15 回复  |  直到 2017-11-27 09:23:14 +08:00
        1
    golmic   89 天前 via Android
    额。。这不是很简单么。。你用 python 写个 for 循环
        2
    scriptB0y   89 天前
    用内置的 csv 模块 for 循环输出
        3
    SlipStupig   89 天前
    @golmic
    @scriptB0y
    问题是内嵌的字段,问题是不确定 key 的名称,这个 schema 长度是不固定的
        4
    janxin   88 天前 via iPhone
    @SlipStupig 那就遍历两遍…
        5
    faketemp   88 天前   ♥ 1
    好吧 看来我要告诉你一个神器了 常见格式数据一键自动转换 数据处理懒人必备库
    python 第三方库 Tablib
    https://github.com/kennethreitz/tablib
        6
    admirez   88 天前 via iPhone
    @faketemp 感谢
        7
    SlipStupig   88 天前
    @janxin 你的前提前提是知道有多少嵌套对象,但是我是不知道的,你怎么确定写两遍一定可以呢?

    @faketemp 感谢哦,我看看能不能解决
        8
    janxin   88 天前
    @SlipStupig 第一遍取完所有的 key,第二遍填内容,怎么可能不可以?
        9
    SlipStupig   88 天前
    @janxin 当然不行,如果是内嵌的话, 例如:

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

    这里面有三层,你一次根本弄不完
        10
    janxin   88 天前
    @SlipStupig 为什么取不完...
        11
    SlipStupig   88 天前
    @janxin show your code
        12
    allen0125   88 天前
    同样需求的表示持续关注
        13
    yb3712590   87 天前
    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   87 天前
    @yb3712590 感謝你的回答,但是我这个不是一个好主意,因为如果内嵌更多数据后,依然无法全部解压出来,需要写更多的 for 循环
        15
    SlipStupig   87 天前
    @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
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   1111 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 28ms · UTC 16:45 · PVG 00:45 · LAX 08:45 · JFK 11:45
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1