Python实现简单的多任务mysql转xml的方法


Posted in Python onFebruary 08, 2017

本文实例讲述了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程序设计有所帮助。

Python 相关文章推荐
python操作mongodb根据_id查询数据的实现方法
May 20 Python
基于Django的ModelForm组件(详解)
Dec 07 Python
Python多线程原理与用法详解
Aug 20 Python
python实现zabbix发送短信脚本
Sep 17 Python
如何关掉pycharm中的python console(图解)
Oct 31 Python
使用IDLE的Python shell窗口实例详解
Nov 19 Python
python实现门限回归方式
Feb 29 Python
服务器端jupyter notebook映射到本地浏览器的操作
Apr 14 Python
解决python Jupyter不能导入外部包问题
Apr 15 Python
OpenCV 之按位运算举例解析
Jun 19 Python
python中@contextmanager实例用法
Feb 07 Python
Python IO文件管理的具体使用
Mar 20 Python
python使用matplotlib绘制折线图教程
Feb 08 #Python
关于Python中Inf与Nan的判断问题详解
Feb 08 #Python
python3.5实现socket通讯示例(TCP)
Feb 07 #Python
Python中字典的setdefault()方法教程
Feb 07 #Python
Python连接数据库学习之DB-API详解
Feb 07 #Python
使用Python中的tkinter模块作图的方法
Feb 07 #Python
Scrapy-redis爬虫分布式爬取的分析和实现
Feb 07 #Python
You might like
PHP 读取文件的正确方法
2009/04/29 PHP
php 服务器调试 Zend Debugger 的安装教程
2009/09/25 PHP
解析php如何将日志写进syslog
2013/06/28 PHP
使用php实现截取指定长度
2013/08/06 PHP
PHP可变变量学习小结
2015/11/29 PHP
原生php实现excel文件读写的方法分析
2018/04/25 PHP
Jquery插件写法笔记整理
2012/09/06 Javascript
js遍历td tr等html元素
2012/12/13 Javascript
form表单action提交的js部分与html部分
2014/01/07 Javascript
jQuery寻找n以内完全数的方法
2015/06/24 Javascript
js+css简单实现网页换肤效果
2015/12/29 Javascript
基于JS代码实现导航条弹出式悬浮菜单
2016/06/17 Javascript
AngularJS基础 ng-keypress 指令简单示例
2016/08/02 Javascript
解析预加载显示图片艺术
2016/12/05 Javascript
微信端开发--登录小程序步骤
2017/01/11 Javascript
jquery实现焦点轮播效果
2017/02/23 Javascript
详解使用React进行组件库开发
2018/02/06 Javascript
vue使用中的内存泄漏【推荐】
2018/07/10 Javascript
webpack4.x打包过程详解
2018/07/18 Javascript
vue2.0获取鼠标位置的方法
2018/09/13 Javascript
推荐15个最好用的JavaScript代码压缩工具
2019/02/13 Javascript
Vue+ElementUI使用vue-pdf实现预览功能
2019/11/26 Javascript
js实现简单的轮播图效果
2020/12/13 Javascript
python解释器pycharm安装及环境变量配置教程图文详解
2020/02/26 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
Java爬虫技术框架之Heritrix框架详解
2020/07/22 Python
HTML5 Canvas标签使用收录
2009/07/07 HTML / CSS
雅高酒店中国:Accorhotels.com China
2018/03/26 全球购物
儿科护理实习自我鉴定
2013/09/19 职场文书
计算机应用专业毕业生求职信
2013/10/24 职场文书
学习十八大报告感言
2014/02/04 职场文书
多媒体编辑专业毕业生求职信
2014/06/13 职场文书
销售团队获奖感言
2014/08/14 职场文书
2014年营业员工作总结
2014/11/18 职场文书
2016领导干部廉洁从政心得体会
2016/01/19 职场文书
2019公司管理制度
2019/04/19 职场文书