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网络编程学习笔记(五):socket的一些补充
Jun 09 Python
Python中使用hashlib模块处理算法的教程
Apr 28 Python
Python与Java间Socket通信实例代码
Mar 06 Python
Python实现的十进制小数与二进制小数相互转换功能
Oct 12 Python
Python中 传递值 和 传递引用 的区别解析
Feb 22 Python
python多行字符串拼接使用小括号的方法
Mar 19 Python
python异步实现定时任务和周期任务的方法
Jun 29 Python
python 梯度法求解函数极值的实例
Jul 10 Python
python 判断三个数字中的最大值实例代码
Jul 24 Python
Django 通过JS实现ajax过程详解
Jul 30 Python
django+tornado实现实时查看远程日志的方法
Aug 12 Python
Python结合Window计划任务监测邮件的示例代码
Aug 05 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 写文本日志实现代码
2010/05/18 PHP
PHP下常用正则表达式整理
2010/10/26 PHP
解析smarty模板中类似for的功能实现
2013/06/18 PHP
codeigniter中测试通过的分页类示例
2014/04/17 PHP
PHP获取mysql数据表的字段名称和详细信息的方法
2014/09/27 PHP
smarty中英文多编码字符截取乱码问题解决方法
2014/10/28 PHP
nodejs命令行参数处理模块commander使用实例
2014/09/17 NodeJs
浅谈类似于(function(){}).call()的js语句
2015/03/30 Javascript
使用JavaScript的AngularJS库编写hello world的方法
2015/06/23 Javascript
JavaScript实现基于十进制的四舍五入实例
2015/07/17 Javascript
详解JavaScript时间处理之几个月前或几个月后的指定日期
2016/12/21 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
使用bat打开多个cmd窗口执行gulp、node
2017/02/17 Javascript
JS随机排序数组实现方法分析
2017/10/11 Javascript
zTree节点文字过多的处理方法
2017/11/24 Javascript
解决Linux无法正常安装与卸载Node.js的方法
2018/01/19 Javascript
Angular 封装并发布组件的方法示例
2018/04/19 Javascript
React Native基础入门之初步使用Flexbox布局
2018/07/02 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
2018/10/30 Javascript
微信小程序学习笔记之获取位置信息操作图文详解
2019/03/29 Javascript
AjaxFileUpload.js实现异步上传文件功能
2019/04/19 Javascript
原生JS实现留言板功能
2020/02/08 Javascript
浅析vue cli3 封装Svgicon组件正确姿势(推荐)
2020/04/27 Javascript
WebPack工具运行原理及入门教程
2020/12/02 Javascript
使用python编写简单的小程序编译成exe跑在win10上
2018/01/15 Python
python远程连接服务器MySQL数据库
2018/07/02 Python
Windows下PyCharm安装图文教程
2018/08/27 Python
python实现转盘效果 python实现轮盘抽奖游戏
2019/01/22 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
Python之关于类变量的两种赋值区别详解
2020/03/12 Python
使用CSS3实现input多选框自定义样式的方法示例
2019/07/19 HTML / CSS
海南地接欢迎词
2014/01/14 职场文书
绿色家庭事迹材料
2014/05/01 职场文书
2015年幼儿教育工作总结
2015/07/24 职场文书
2016教师廉洁教育心得体会
2016/01/13 职场文书
保安辞职申请书应该怎么写?
2019/07/15 职场文书