• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Python的dict转object

mysql 搞代码 4年前 (2022-01-09) 46次浏览 已收录 0个评论

项目数据库是mongoDB,用pymongo进行find操作,查询结果是一串dict。现在要把查询结果用xlwt导出为csv文件,例如有一条数据如下: # dict数据row = { domain : dmyz.org, page_rank : 2, city : Beijing, country : China}# 以下是csv相关代码fields = [‘dom

项目数据库是mongoDB,用pymongo进行find操作,查询结果是一串dict。现在要把查询结果用xlwt导出为csv文件,例如有一条数据如下:

# dict数据row = {    "domain" : "dmyz.org",    "page_rank" : 2,    "city" : "Beijing",  <i style="color:transparent">本文来源gaodai$ma#com搞$$代**码网$</i>  "country" : "China"}# 以下是csv相关代码fields = ['domain', 'page_rank', 'country', 'city']wb = xlwt.Workbook()ws = wb.add_sheet('Sheet1')for i in range(len(fields)):    ws.write(0, i, fields[i])

要得到domain的值,是用row[‘domain’],但我希望能用对象的访问形式,例如row.domain来获取(严格来说这篇文章的标题有歧义,我真正的需求是改变dict的访问形式,而且Python中一切都是对象,object也是dict的基类。)

要实现这个需求,最容易想到的是用循环来做:

def _dict_to_object(d):    class _O: pass    [setattr(_O, _k, d[_k]) for _k in d]    return _Or = _dict_to_object(row)print r.page_rank

上面的代码就是定义一个名为_O的类,用setattr函数(或者__setattr__方法),把dict添加进去。

更简单的做法是利用类的__dict__方法:

class Struct:    def __init__(self, **entries):        self.__dict__.update(entries)r = Struct(**row)print row.page_rank

以上例子中的dict只有一层,实际生产环境中,这个dict是两层的,所以实际的代码做了些改动:

row = {    "url" : {        "domain" : "dmyz.org"    },    "page_rank" : 2,    "geography" : {        "city" : "Beijing",        "country" : "China"    }}def _dict_to_object(d):    class O: pass    for _k in d:        if type(d[_k]) == dict:            setattr(O, _k, Struct(**d[_k]))        else:            setattr(O, _k, d[_k])    return Or = _dict_to_object(row)print r.url.domain

如果层次更多,就改成迭代的写法。还想到一个简单的思路:mongoDB的数据都是存成json的,只要在解析json时,替换dict的处理,也就是加上object_hook就可以实现了:

from collections import namedtuplerow = '''{    "url" : {        "domain" : "dmyz.org"    },    "page_rank" : 2,    "geography" : {        "city" : "Beijing",        "country" : "China"    }}'''x = json.loads(row, object_hook=lambda d: namedtuple('X', d.keys())(*d.values()))print x.url.domain

但这样要把pymongo查询出来的dict转成str再做处理,多了一步无用的操作,暂时没想到好的解决方案。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Python的dict转object

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址