Heim  >  Artikel  >  Datenbank  >  Python的dict转object

Python的dict转object

WBOY
WBOYOriginal
2016-06-07 16:31:032029Durchsuche

项目数据库是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])

要得到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

上面的代码就是定义一个名为_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 O
r = _dict_to_object(row)
print r.url.domain

如果层次更多,就改成迭代的写法。还想到一个简单的思路: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

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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn