Home > Database > Mysql Tutorial > body text

Python的dict转object

WBOY
Release: 2016-06-07 16:31:03
Original
2075 people have browsed it

项目数据库是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",
    "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])
Copy after login

要得到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 _O
r = _dict_to_object(row)
print r.page_rank
Copy after login

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

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

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

以上例子中的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 O
r = _dict_to_object(row)
print r.url.domain
Copy after login

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

from collections import namedtuple
row = '''{
    "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
Copy after login

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

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template