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杀死一个线程的方法
Sep 06 Python
Python模拟登录验证码(代码简单)
Feb 06 Python
Python基于回溯法子集树模板解决数字组合问题实例
Sep 02 Python
Python定义二叉树及4种遍历方法实例详解
Jul 05 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
Dec 04 Python
Python正则表达式和re库知识点总结
Feb 11 Python
使用Python控制摄像头拍照并发邮件
Apr 23 Python
python pytest进阶之fixture详解
Jun 27 Python
python 子类调用父类的构造函数实例
Mar 12 Python
Visual Studio code 配置Python开发环境
Sep 11 Python
OpenCV利用python来实现图像的直方图均衡化
Oct 21 Python
Python 解决空列表.append() 输出为None的问题
May 23 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
Ajax提交表单时验证码自动验证 php后端验证码检测
2016/07/20 PHP
PHPMailer ThinkPHP实现自动发送邮件功能
2018/06/10 PHP
PHP扩展安装方法步骤解析
2020/11/24 PHP
Jquery.LazyLoad.js修正版下载,实现图片延迟加载插件
2011/03/12 Javascript
JQuery扩展插件Validate 5添加自定义验证方法
2011/09/05 Javascript
js判断字符长度及中英文数字等
2014/03/19 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
jquery实现先淡出再折叠收起的动画效果
2015/08/07 Javascript
JavaScript组合模式学习要点
2016/08/26 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
基于javascript实现数字英文验证码
2017/01/25 Javascript
Jquery实现跨域异步上传文件总结
2017/02/03 Javascript
vue-cli+webpack在生成的项目中使用bootstrap实例代码
2017/05/26 Javascript
运用jQuery写的验证表单(实例讲解)
2017/07/06 jQuery
javaScript动态添加Li元素的实例
2018/02/24 Javascript
JS验证输入的是否是数字及保留几位小数问题
2018/05/09 Javascript
微信小程序数据分析之自定义分析的实现
2018/08/17 Javascript
jQuery+vue.js实现的多选下拉列表功能示例
2019/01/15 jQuery
如何配置vue.config.js 处理static文件夹下的静态文件
2020/06/19 Javascript
vue的$http的get请求要加上params操作
2020/11/12 Javascript
详解如何在vue+element-ui的项目中封装dialog组件
2020/12/11 Vue.js
python随机数分布random测试
2018/08/27 Python
python生成多个只含0,1元素的随机数组或列表的实例
2018/11/12 Python
python 列表中[ ]中冒号‘:’的作用
2019/04/30 Python
Numpy之reshape()使用详解
2019/12/26 Python
IntelliJ 中配置 Anaconda的过程图解
2020/06/01 Python
python 实现倒计时功能(gui界面)
2020/11/11 Python
IE兼容css3圆角的实现代码
2011/07/21 HTML / CSS
教师节标语大全
2014/10/07 职场文书
大一新生检讨书
2014/10/29 职场文书
校车司机安全责任书
2015/05/11 职场文书
2016年“七一建党节”广播稿
2015/12/18 职场文书
机械原理课程设计心得体会
2016/01/15 职场文书
Python爬虫数据的分类及json数据使用小结
2021/03/29 Python
详解PHP服务器如何在有限的资源里最大提升并发能力
2021/05/25 PHP
Spring 使用注解开发
2022/05/20 Java/Android