Python实现简单的多任务mysql转xml的方法
作者:toil 发布时间:2024-01-26 20:11:07
标签:Python,mysql,xml
本文实例讲述了Python实现简单的多任务mysql转xml的方法。分享给大家供大家参考,具体如下:
为了需求导出的格式尽量和navicat导出的xml一致。
用的gevent,文件i/o操作会阻塞,所以并不会完全异步。
1. mysql2xml.py:
# -*- coding: utf-8 -*-
'''
Created on 2014/12/27
@author: Yoki
'''
import gevent
import pymysql
from pymysql.cursors import DictCursor
import re
import codecs
db_conn = None
def init_mysql_connect(*args, **kwargs):
global db_conn
db_conn = pymysql.connect(*args, **kwargs)
def list_to_xml(result_cur, key_list):
'''
mysql 结果集转xml,非xml标准导出方式; xml dom 不支持相同名字的node
:param result_cur:
:param key_list:
:return:
'''
content = ''
content += '<?xml version="1.0" encoding="UTF-8" ?>\r\n'
content += '<RECORDS>\r\n' # root节点
for item in result_cur:
content += '\t<RECORD>\r\n'
for k in key_list:
v = item.get(k, '')
real_value = v
content += '\t\t<%s>%s</%s>\r\n' % (k, real_value, k)
content += '\t</RECORD>\r\n'
content += '</RECORDS>\r\n'
return content
def get_table_rows(tb_name):
'''
获取mysql表rows
:param tb_name:
:return:
'''
global db_conn
rows = []
cursor = db_conn.cursor(cursor=DictCursor)
cursor.execute('select * from %s' % tb_name)
for row in cursor:
rows.append(row)
return rows
def get_table_keys(tb_name):
'''
获取表中字段,顺序 为创建表时的顺序
:param tb_name:
:return:
'''
global db_conn
cursor = db_conn.cursor(cursor=DictCursor)
cur = cursor.execute('show create table %s' % tb_name)
if cur != 1:
raise Exception
for r in cursor:
create_sql = r['Create Table']
fields = re.findall('`(.*?)`', create_sql)
result = []
# 处理字段
for i in xrange(1, len(fields)):
field = fields[i]
if field in result:
continue
result.append(field)
return result
return []
def mysql_to_xml(tb_name, output_dir='xml', postfix='xml'):
'''
mysql数据导出xml,
:param tb_name: 数据库表名
:param output_dir:
:param postfix:
:return:
'''
rows = get_table_rows(tb_name)
keys = get_table_keys(tb_name)
content = list_to_xml(rows, keys)
fp = codecs.open('%s/%s.%s' % (output_dir, tb_name, postfix), 'w', 'utf-8')
fp.write(content)
fp.close()
tb_list = [
'tb_item',
'tb_state'
]
if __name__ == '__main__':
init_mysql_connect(host="localhost", user='user', password="password", database='test', port=3306,
charset='utf8')
jobs = []
for tb_name in tb_list:
jobs.append(gevent.spawn(mysql_to_xml, tb_name))
gevent.joinall(jobs)
2. list_to_xml函数修改,速度提升上百倍
def list_to_xml(result_cur, key_list):
fp = codecs.open('test.xml'), 'w', 'utf-8')
fp.write('<?xml version="1.0" encoding="UTF-8" ?>\r\n')
fp.write('<RECORDS>\r\n')
for item in result_cur:
fp.write('\t<RECORD>\r\n')
for k in key_list:
v = item.get(k, '')
if v is None:
real_value = ''
else:
if type(v) == unicode:
real_value = cgi.escape(v)
else:
real_value = v
fp.write('\t\t<%s>%s</%s>\r\n' % (k, real_value, k))
fp.write('\t</RECORD>\r\n')
fp.write('</RECORDS>\r\n')
fp.close()
希望本文所述对大家Python程序设计有所帮助。


猜你喜欢
- 询问度娘搭好appium和python环境,开启移动app自动化的探索(基于Android),首先来记录下如何启动待测的app吧!如何启动A
- 折纸是日本著名的折叠纸张的艺术。折纸艺术只是使用一些不同的折叠方式,却能被用各种各样的方式组合成错综复杂的设计。而受折纸启发的logo设计则
- 摘要: 本文由简到繁地介绍了以jQuery作为蓝本的js框架开发步聚, 希望借助本文大家对jQuery这样的框架内部有一个大致的认识。推荐:
- 本文是 《用 Golang 实现一个 Redis》系列文章第二篇,本文将分别介绍Redis 通信协议 以及 协议解析器 的实现,若您对协议有
- 如下所示:import matplotlib.pyplot as pltimport numpy as npa = np.array([1,
- mitmproxy有3中监听请求与响应的方式:mitmproxy控制台方式mitmdump与Python对接的方式mitmweb可视化方式前
- python字典怎么排序?定义一个字典类型mydict = {2: '小路', 3: '黎明', 1:
- IE历来被web标准的拥护者所诟病,而当FireFox横空出世以后,更多的网页制作者开始关注web标准设计。看着FireFox的市场占有率不
- (1)IN运算符:它可以用来匹配一个固定集合中的某一项。比如说一个集合里面的年份有(2001,2003,2005),那么就可以有:SELEC
- 除了使用xshell等连接服务器以外,pycharm也可以连接服务器,在服务器上运行代码,上传下载文件等操作。步骤如下:1、pycharm工
- Numpy中的数组整体处理赋值操作一直让我有点迷糊,很多时候理解的不深入。今天单独列写相关的知识点,进行总结一下。先看两个代码片小例子:例子
- 一、前言有时候觉得电影真是人类有史以来最伟大的发明,我喜欢看电影,看电影可以让我们增长见闻,学习知识。从某种角度上而言,电影凭借自身独有的魅
- 0x01 iframe的跳出框架0x02 iframe样式设置0x03 iframe重置高度1、首先来一个,跳出iframe的好方法,直接可
- 1、远程登录到linux上,使用到的模块paramiko#远程登陆操作系统def ssh(sys_ip,username,password,
- 首先,这片文章纯粹是我的个人经验之谈,适用于我常见的环境及项目中。个人建议,数据库字符集尽量使用utf8(HTML页面对应的是utf-8),
- 服务端监听端口 listen()方法:net.listen({监听类型},{监听的ip和端口})(conn, err){}返回值:conn是
- 引言微信小程序为了优化用户体验,取消了在进入小程序时立马出现授权窗口。需要用户主动点击按钮,触发授权窗口。那么,在我实践过程中,出现了以下问
- python pyaudio音频录制安装所需要的包pip install pyaudio监听麦克风import pyaudioimport
- set转成list方法如下: list转成set方法如下:s = set('12342212') &n
- golang学习第一波,使用http get请求高德天气接口。一、准备内容:1、注册高德开发者账号,申请key 2、golang开发工具Li