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查看模块安装位置的方法
Oct 16 Python
python pands实现execl转csv 并修改csv指定列的方法
Dec 12 Python
Python实现SQL注入检测插件实例代码
Feb 02 Python
python导入坐标点的具体操作
May 10 Python
django基于存储在前端的token用户认证解析
Aug 06 Python
深入了解如何基于Python读写Kafka
Dec 31 Python
Python程序控制语句用法实例分析
Jan 14 Python
Python3开发实例之非关系型图数据库Neo4j安装方法及Python3连接操作Neo4j方法实例
Mar 18 Python
python函数调用,循环,列表复制实例
May 03 Python
Tensorflow全局设置可见GPU编号操作
Jun 30 Python
python 将列表里的字典元素合并为一个字典实例
Sep 01 Python
pycharm 实现复制一行的快捷键
Jan 15 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性能优化 产生高度优化代码
2011/07/22 PHP
PHP和javascript常用正则表达式及用法实例
2014/07/01 PHP
php在数据库抽象层简单使用PDO的方法
2015/11/03 PHP
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
2010/02/26 Javascript
Tab页界面 用jQuery及Ajax技术实现(php后台)
2011/10/12 Javascript
深入理解JavaScript系列(12) 变量对象(Variable Object)
2012/01/16 Javascript
jQuery语法总结和注意事项小结
2012/11/11 Javascript
AngularJS入门教程(零):引导程序
2014/12/06 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
ES6新特性三: Generator(生成器)函数详解
2017/04/21 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
2017/04/27 jQuery
在ABP框架中使用BootstrapTable组件的方法
2017/07/31 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
2017/09/18 Javascript
JS基于贪心算法解决背包问题示例
2017/11/27 Javascript
JS通过位运算实现权限加解密
2018/08/14 Javascript
在 Vue 中编写 SVG 图标组件的方法
2020/02/24 Javascript
js编写简易的计算器
2020/07/29 Javascript
Vue实现小购物车功能
2020/12/21 Vue.js
python中字典dict常用操作方法实例总结
2015/04/04 Python
Python使用get_text()方法从大段html中提取文本的实例
2019/08/27 Python
python urllib爬虫模块使用解析
2019/09/05 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
2019/10/16 Python
Python 实现一行输入多个数字(用空格隔开)
2020/04/29 Python
Pytorch上下采样函数--interpolate用法
2020/07/07 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
2020/11/12 Python
基于django和dropzone.js实现上传文件
2020/11/24 Python
html5 拖拽上传图片实例演示
2013/04/01 HTML / CSS
德国原装品牌香水、化妆品和手表网站:BRASTY.DE
2016/10/16 全球购物
电气工程及其自动化自我评价四篇
2013/09/24 职场文书
农村婚礼证婚词
2014/01/10 职场文书
周年庆典邀请函范文
2014/01/23 职场文书
记账会计岗位职责
2014/06/16 职场文书
2019年工作总结范文
2019/05/21 职场文书
Python编程源码报错解决方法总结经验分享
2021/10/05 Python
解决redis批量删除key值的问题
2022/03/23 Redis
Python编写车票订购系统 Python实现快递收费系统
2022/08/14 Python