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对json的相关操作实例详解
Jan 04 Python
Python3 使用cookiejar管理cookie的方法
Dec 28 Python
详解Python3序列赋值、序列解包
May 14 Python
python文件选择对话框的操作方法
Jun 27 Python
对Python的交互模式和直接运行.py文件的区别详解
Jun 29 Python
调试Django时打印SQL语句的日志代码实例
Sep 12 Python
Python rabbitMQ如何实现生产消费者模式
Aug 24 Python
python读取图片颜色值并生成excel像素画的方法实例
Feb 19 Python
Python机器学习三大件之一numpy
May 10 Python
七个非常实用的Python工具包总结
Jun 15 Python
什么是Python装饰器?如何定义和使用?
Apr 11 Python
如何使用python包中的sched事件调度器
Apr 30 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
删除无限分类并同时删除它下面的所有子分类的方法
2010/08/08 PHP
PHP的命令行命令使用指南
2015/08/18 PHP
PHP面向对象学习之parent::关键字
2017/01/18 PHP
JQuery中$之选择器用法介绍
2011/04/05 Javascript
jquery对元素拖动排序示例
2014/01/16 Javascript
二叉树的非递归后序遍历算法实例详解
2014/02/07 Javascript
JavaScript的null和undefined区别示例介绍
2014/09/15 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
轻松创建nodejs服务器(8):非阻塞是如何实现的
2014/12/18 NodeJs
js制作简易年历完整实例
2015/01/28 Javascript
解决jquery插件:TypeError:$.browser is undefined报错的方法
2015/11/21 Javascript
JavaScript兼容性总结之获取非行间样式案例
2016/08/07 Javascript
用js实现博客打赏功能
2016/10/24 Javascript
Vue中computed与methods的区别详解
2018/03/24 Javascript
Python实现周期性抓取网页内容的方法
2015/11/04 Python
Python复制文件操作实例详解
2015/11/10 Python
python爬虫入门教程--优雅的HTTP库requests(二)
2017/05/25 Python
Python并发编程协程(Coroutine)之Gevent详解
2017/12/27 Python
tensorflow获取变量维度信息
2018/03/10 Python
Python决策树之基于信息增益的特征选择示例
2018/06/25 Python
django 自定义过滤器的实现
2019/02/26 Python
Html5原生拖拽相关事件简介以及基础实现
2020/11/19 HTML / CSS
盖尔斯工厂店:GUESS Factory
2020/01/21 全球购物
如何找出EMP表里面SALARY第N高的employee
2013/12/05 面试题
信息专业大学生自我评价分享
2014/01/17 职场文书
自考生自我评价分享
2014/01/18 职场文书
大学毕业感言一句话
2014/02/06 职场文书
幼儿园教师获奖感言
2014/03/11 职场文书
《有趣的发现》教学反思
2014/04/15 职场文书
大学生实习证明范文(5篇)
2014/09/18 职场文书
升职感谢信
2015/01/22 职场文书
2015年市场营销工作总结
2015/07/23 职场文书
环保建议书作文300字
2015/09/14 职场文书
Python中使用subprocess库创建附加进程
2021/05/11 Python
解决MySQL添加新用户-ERROR 1045 (28000)的问题
2022/03/03 MySQL
SpringBoot整合Minio文件存储
2022/04/03 Java/Android