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进行行为驱动开发的入门教程
Apr 23 Python
在Python中使用第三方模块的教程
Apr 27 Python
python的多重继承的理解
Aug 06 Python
浅谈关于Python3中venv虚拟环境
Aug 01 Python
Python3 使用pillow库生成随机验证码
Aug 26 Python
Python对接 xray 和微信实现自动告警
Sep 17 Python
Python高级特性之闭包与装饰器实例详解
Nov 19 Python
flask框架蓝图和子域名配置详解
Jan 25 Python
python数据预处理方式 :数据降维
Feb 24 Python
Python抓包程序mitmproxy安装和使用过程图解
Mar 02 Python
python3 正则表达式基础廖雪峰
Mar 25 Python
python切片作为占位符使用实例讲解
Feb 17 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
简单了解将WordPress中的工具栏移到底部的小技巧
2015/12/31 PHP
CI(CodeIgniter)模型用法实例分析
2016/01/20 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
2016/11/04 PHP
PHP数据库操作三:redis用法分析
2017/08/16 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
2018/05/28 PHP
[对联广告] JS脚本类
2006/08/27 Javascript
javascript iframe中打开文件,并检测iframe存在否
2008/12/28 Javascript
理解Javascript_12_执行模型浅析
2010/10/18 Javascript
JS模板实现方法
2013/04/03 Javascript
jQuery .attr()和.removeAttr()方法操作元素属性示例
2013/07/16 Javascript
JavaScript地图拖动功能SpryMap的简单实现
2013/07/17 Javascript
鼠标悬浮停留三秒后自动显示大图js代码
2014/09/09 Javascript
BootStrap fileinput.js文件上传组件实例代码
2017/02/20 Javascript
通过nodejs 服务器读取HTML文件渲染到页面的方法
2018/05/17 NodeJs
vant 中van-list的用法说明
2020/11/11 Javascript
python 添加用户设置密码并发邮件给root用户
2016/07/25 Python
Python中音频处理库pydub的使用教程
2017/06/07 Python
Python打印“菱形”星号代码方法
2018/02/05 Python
用python处理图片实现图像中的像素访问
2018/05/04 Python
python中sys.argv函数精简概括
2018/07/08 Python
Python3之手动创建迭代器的实例代码
2019/05/22 Python
Django框架教程之中间件MiddleWare浅析
2019/12/29 Python
Python flask框架如何显示图像到web页面
2020/06/03 Python
瑞士领先的网上超市:LeShop.ch
2018/11/14 全球购物
Pretty You London官网:英国拖鞋和睡衣品牌
2019/05/08 全球购物
您附近的水疗和健康场所:Spafinder(美国)
2019/07/05 全球购物
最好的商品表达自己:Cafepress
2019/09/04 全球购物
民生工程实施方案
2014/03/22 职场文书
五一劳动节活动记录
2014/03/23 职场文书
股权转让意向书
2014/04/01 职场文书
残疾人小组计划书
2014/04/27 职场文书
计算机应用专业毕业生求职信
2014/06/03 职场文书
双拥工作宣传标语
2014/06/26 职场文书
2015年音乐教学工作总结
2015/07/22 职场文书
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript
WebRTC记录音视频流(web技术分享)
2022/02/24 Javascript