Python的dict转object
项目数据库是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再做处理,多了一步无用的操作,暂时没想到好的解决方案。
原文地址:Python的dict转object, 感谢原作者分享。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











小さなXMLファイルの場合、注釈コンテンツをテキストエディターに直接置き換えることができます。大きなファイルの場合、XMLパーサーを使用してそれを変更して、効率と精度を確保することをお勧めします。 XMLコメントを削除するときは注意してください。コメントを維持すると、通常、コードの理解とメンテナンスが役立ちます。高度なヒントは、XMLパーサーを使用してコメントを変更するためのPythonサンプルコードを提供しますが、特定の実装を使用するXMLライブラリに従って調整する必要があります。 XMLファイルを変更する際のエンコード問題に注意してください。 UTF-8エンコードを使用して、エンコード形式を指定することをお勧めします。

Mobile XMLからPDFへの速度は、次の要因に依存します。XML構造の複雑さです。モバイルハードウェア構成変換方法(ライブラリ、アルゴリズム)コードの品質最適化方法(効率的なライブラリ、アルゴリズムの最適化、キャッシュデータ、およびマルチスレッドの利用)。全体として、絶対的な答えはなく、特定の状況に従って最適化する必要があります。

XMLコンテンツを変更するには、ターゲットノードの正確な検出が必要であるため、プログラミングが必要です。プログラミング言語には、XMLを処理するための対応するライブラリがあり、APIを提供して、データベースの運用などの安全で効率的で制御可能な操作を実行します。

XMLをPDFに直接変換するアプリケーションは、2つの根本的に異なる形式であるため、見つかりません。 XMLはデータの保存に使用され、PDFはドキュメントを表示するために使用されます。変換を完了するには、PythonやReportLabなどのプログラミング言語とライブラリを使用して、XMLデータを解析してPDFドキュメントを生成できます。

Protobufの文字列定数列挙を定義する問題Protobufを使用する場合、列挙タイプを文字列定数に関連付ける必要がある状況に遭遇することがよくあります...

XML画像を変換するには、最初にXMLデータ構造を決定し、次に適切なグラフィカルライブラリ(PythonのMatplotlibなど)とメソッドを選択し、データ構造に基づいて視覚化戦略を選択し、データのボリュームと画像形式を検討し、バッチ処理を実行するか、効率的なライブラリを使用して、最終的にPNG、JPEG、またはSVGに応じて保存します。

ほとんどのテキストエディターを使用して、XMLファイルを開きます。より直感的なツリーディスプレイが必要な場合は、酸素XMLエディターやXMLSPYなどのXMLエディターを使用できます。プログラムでXMLデータを処理する場合、プログラミング言語(Pythonなど)やXMLライブラリ(XML.ETREE.ELEMENTTREEなど)を使用して解析する必要があります。

携帯電話の高品質でXMLをPDFに変換する必要があります。クラウドでXMLを解析し、サーバーレスコンピューティングプラットフォームを使用してPDFを生成します。効率的なXMLパーサーとPDF生成ライブラリを選択します。エラーを正しく処理します。携帯電話の重いタスクを避けるために、クラウドコンピューティングの能力を最大限に活用してください。複雑なXML構造の処理、マルチページPDFの生成、画像の追加など、要件に応じて複雑さを調整します。デバッグを支援するログ情報を印刷します。パフォーマンスを最適化し、効率的なパーサーとPDFライブラリを選択し、非同期プログラミングまたは前処理XMLデータを使用する場合があります。優れたコードの品質と保守性を確保します。
