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 相关文章推荐
Windows系统配置python脚本开机启动的3种方法分享
Mar 10 Python
Python中自定义函数的教程
Apr 27 Python
Python写入数据到MP3文件中的方法
Jul 10 Python
浅谈Python爬取网页的编码处理
Nov 04 Python
python2.7安装图文教程
Mar 13 Python
Python 忽略warning的输出方法
Oct 18 Python
pycharm中成功运行图片的配置教程
Oct 28 Python
Python二次规划和线性规划使用实例
Dec 09 Python
Django模型中字段属性choice使用说明
Mar 30 Python
Python使用pdb调试代码的技巧
May 03 Python
python与c语言的语法有哪些不一样的
Sep 13 Python
Django配置跨域并开发测试接口
Nov 04 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截取汉字乱码问题解决方法mb_substr函数的应用
2008/03/30 PHP
新手菜鸟必读:session与cookie的区别
2013/08/22 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
短信提示使用 特效
2007/01/19 Javascript
ExtJS Ext.MessageBox.alert()弹出对话框详解
2010/04/02 Javascript
事件冒泡是什么如何用jquery阻止事件冒泡
2013/03/20 Javascript
js 使FORM表单的所有元素不可编辑的示例代码
2013/10/17 Javascript
鼠标滚轴控制文本框值的JS代码
2013/11/19 Javascript
js定时器的使用(实例讲解)
2014/01/06 Javascript
为jQuery添加Webkit的触摸的方法分享
2014/02/02 Javascript
javascript面向对象快速入门实例
2015/01/13 Javascript
jQuery 处理页面的事件详解
2015/01/20 Javascript
AngularJS基础学习笔记之简单介绍
2015/05/10 Javascript
js前端实现图片懒加载(lazyload)的两种方式
2017/04/24 Javascript
基于JavaScript实现图片连播和联级菜单实例代码
2017/07/28 Javascript
详解关于webpack多入口热加载很慢的原因
2019/04/24 Javascript
原生JS实现图片懒加载之页面性能优化
2019/04/26 Javascript
微信小程序事件流原理解析
2019/11/27 Javascript
JS实现可视化音频效果的实例代码
2020/01/16 Javascript
Python HTMLParser模块解析html获取url实例
2015/04/08 Python
python中的全局变量用法分析
2015/06/09 Python
Python图算法实例分析
2016/08/13 Python
Python中函数eval和ast.literal_eval的区别详解
2017/08/10 Python
Python实现按特定格式对文件进行读写的方法示例
2017/11/30 Python
python3+PyQt5+Qt Designer实现扩展对话框
2018/04/20 Python
8种用Python实现线性回归的方法对比详解
2019/07/10 Python
Python实现桌面翻译工具【新手必学】
2020/02/12 Python
python redis存入字典序列化存储教程
2020/07/16 Python
Python下载网易云歌单歌曲的示例代码
2020/08/12 Python
The Hut德国站点:时装、家居用品、美容等
2016/09/23 全球购物
竞聘演讲稿开场白
2014/08/25 职场文书
学习党的群众路线对照检查材料
2014/09/29 职场文书
人事专员岗位职责
2015/02/03 职场文书
公司处罚决定书
2015/06/24 职场文书
安全生产培训心得体会
2016/01/18 职场文书
jdbc使用PreparedStatement批量插入数据的方法
2021/04/27 MySQL