from pymongo import MongoClient
import asyncio
import xlwt
import json class Mongodb_Transfer_Excel():
def __init__(self, db_name, table_name, ip='127.0.0.1', port=27017, excel_format=None, mongodb_type=None):
""" :param db_name: 数据库名
:param table_name: 数据表名
:param ip: IP
:param port: 端口
:param excel_format: 数据需求的字段:{'content': 0, 'field': 1}
"""
self.ip = ip
self.port = port
self.db_name = db_name
self.table_name = table_name
self.excel_format = excel_format # excel_format如:{'content': 0, 'field': 1}
self.wbk = xlwt.Workbook()
self.sheet = self.wbk.add_sheet(self.table_name)
self.mongodb_type = mongodb_type
self.loop = asyncio.get_event_loop() def db_conn(self):
"""
创建数据库连接
:return:
"""
conn = MongoClient(self.ip, self.port)
db = conn[self.db_name] # 连接mydb数据库,没有则自动创建
conn = db[self.table_name] # 使用test_set集合,没有则自动创建
return conn def find_data(self):
"""
获取mongdb数据
:return:
"""
rows = self.db_conn().find()
return rows def create_excel(self):
"""
根据self.excel_format生成execl
:return:
"""
if self.excel_format:
excel_format = self.excel_format
else:
excel_format = {'content': 0, 'content1': 1, 'title': 2, "weixin_code": 3, "weixin_name": 4, "type": 5, 'pubtime': 6}
self.excel_format = excel_format
for key, value in excel_format.items():
self.sheet.write(0, value, key)
self.wbk.save('{}.xls'.format(self.table_name)) async def parse_rows(self, i, row):
dic = dict()
dic['cloumn'] = i
if 'user' in row:
user_info = row.get('user')
if 'description' in user_info:
dic['description'] = user_info['description']
if 'screenName' in user_info:
dic['screenName'] = user_info['screenName']
if 'result' in row:
result = row['result']
if isinstance(result, str):
result = json.loads(result)
content = result.get('content').replace('\n', '')
if len(content) > 2000:
dic['content'] = content[0: 2000]
dic['conten1'] = content[2000: ]
else:
dic['content'] = content
if 'title' in result:
dic['title'] = result.get('title')
if 'event' in result:
event = result.get('event')
if isinstance(event, str):
event = json.loads(event)
if 'weixin_code' in event:
dic['weixin_code'] = event.get('weixin_code')
if 'weixin_name' in event:
dic['weixin_name'] = event.get('weixin_name')
if 'type' in event:
dic['type'] = event.get('type')
if 'url' in event:
dic['url'] = event.get('url')
if 'pubtime' in result:
dic['pubtime'] = result.get('pubtime')
await asyncio.sleep(1)
self.parse_dic(dic) def parse_dic(self, dic):
for key, value in dic.items():
if key in self.excel_format:
# print(key)
self.write_excel(key, value, dic['cloumn']) def write_excel(self, key, value, columns):
"""
写入数据
:param dic: 数据字典
:param columns: 插入excel的行
:return:
"""
self.sheet.write(columns, int(self.excel_format.get(key)), value) def save_excel(self):
self.wbk.save('{}.xls'.format(self.table_name)) def run(self):
self.create_excel()
rows = self.find_data()
tasks = [self.parse_rows(i + 1, row) for i, row in enumerate(rows)]
self.loop.run_until_complete(asyncio.wait(tasks))
self.loop.close()
self.save_excel() if __name__ == '__main__':
excel_format = {} # 指定excel文件格式如:{'content': 0, 'field': 1}
mongodb_type = 'weibo' # 或者man_sheng_huo
obj = Mongodb_Transfer_Excel(db_name='db_name', table_name='table_name', mongodb_type=mongodb_type,
excel_format=excel_format)
obj.run()

python asyncio 异步实现mongodb数据转xls文件的更多相关文章

  1. 孤荷凌寒自学python第五十九天尝试使用python来读访问远端MongoDb数据服务

    孤荷凌寒自学python第五十九天尝试使用python来读访问远端MongoDb数据服务 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第五天.今天的感觉是,mongoDB数 ...

  2. python读取数据库并把数据写入本地文件

    一,介绍 上周用jmeter做性能测试时,接口B传入的参数需要依赖接口A生成的借贷申请ID,接口A运行完需要把生成的借贷申请ID导出来到一个文件,作为参数传给接口B,刚开始的时候,手动去数据库倒, 倒 ...

  3. Python学习笔记之将数据写入到文件中

    10-3 访客:编写一个程序,提示用户输入其名字:用户作出响应后,将其名字写入到文件guest.txt 中. 编写Python代码: username = input("Please ent ...

  4. http 异步 接收 回传 数据文字和文件流

    public void HttpListenerStar() { try { HttpListener httpListener = new HttpListener(); httpListener. ...

  5. Python中,添加写入数据到已经存在的Excel的xls文件,即打开excel文件,写入新数据

    背景 Python中,想要打开已经存在的excel的xls文件,然后在最后新的一行的数据. 折腾过程 1.找到了参考资料: writing to existing workbook using xlw ...

  6. R_Studio读取xls文件

    百度经验 传送门 需要包xlsx 依赖包rjava 需要安装java编译环境 在R Console中执行命令install.packages("rjava"),install.pa ...

  7. Python黑魔法 --- 异步IO( asyncio) 协程

    python asyncio 网络模型有很多中,为了实现高并发也有很多方案,多线程,多进程.无论多线程和多进程,IO的调度更多取决于系统,而协程的方式,调度来自用户,用户可以在函数中yield一个状态 ...

  8. (转)Python黑魔法 --- 异步IO( asyncio) 协程

    转自:http://www.jianshu.com/p/b5e347b3a17c?from=timeline Python黑魔法 --- 异步IO( asyncio) 协程 作者 人世间 关注 201 ...

  9. 消息/事件, 同步/异步/协程, 并发/并行 协程与状态机 ——从python asyncio引发的集中学习

    我比较笨,只看用await asyncio.sleep(x)实现的例子,看再多,也还是不会. 已经在unity3d里用过coroutine了,也知道是“你执行一下,主动让出权限:我执行一下,主动让出权 ...

随机推荐

  1. pgbench使用记录

    1.初始化: pgbench -i pgbench 如果端口号有变化,需要先手动创建数据库,再执行. pgbench -i -s 10 -p 5433 pgbench 重点:主要用到两个参数,-i:初 ...

  2. C++ 资源管理 —— RAII

    RAII:在构造函数中申请资源,在析构函数中释放资源. 1. RAII 自动实现锁资源的释放 void bad() { m.lock(); f(); if (COND) return; m.unloc ...

  3. PS基础教程[2]渐变工具的使用

    PS中的渐变是一个很实用的工具,很多时候都会用到,我们在网页上看到的各种各样的颜色几乎都是一种渐变色,很少有一种颜色一层不变的.那么渐变如何使用呢?本次我们来介绍一下渐变的基本使用方法. 使用方法 1 ...

  4. MyEclipse2014快速配置Spring & Spring Testing, Spring AOP简单使用

    1.新建项目 2.右击项目,如图,利用myeclipse自动导入spring 3.在弹出的对话框中一直next到最后,在最后的页面中勾选Spring Testing,完成. 4.在src下的appli ...

  5. C#进阶之路(七)反射的应用

    反射在C#中的应用还是很多的,但它对代码的性能有一定影响. 反射的性能: 使用反射来调用类型或者触发方法,或者访问一个字段或者属性时clr 需要做更多的工作:校验参数,检查权限等等,所以速度是非常慢的 ...

  6. TortoiseGit不同分支合并代码2

    现在有主分支master和分支day2.现在要把day2上的变更合并到主分支master上! 1.首先切换到目标分支master上. 说明当前分支是master分支. 2.在master分支上查看提交 ...

  7. mysql时间运算

    DELETE FROM zhongqiu WHERE caretatime<=ADDDATE(NOW(),-14) caretatime` timestamp NOT NULL DEFAULT ...

  8. git 查看、创建、切换、删除、重命名和推送分支

    1.查看本地所有分支:前面有 “*” 的是当前所处的分支 $ git branch test-A * test-B 2.查看本地和远程服务器的所有分支: $ git branch -a test-A ...

  9. 第21篇 ubuntu安装ftp服务器(转载)

    ubuntu安装ftp服务器 1: 安装vsftpd ~$ sudo apt-get install vsftpd ubuntu10.10自己装了,这步省略. 2: 配置vsftpd 2.1 修改vs ...

  10. (转)C# Socket异步通信

    本文转载自:http://www.cnblogs.com/llllll/archive/2009/05/13/1455703.html 服务器端 TCPServer 1.使用的通讯通道:socket ...