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使用xauth方式登录饭否网然后发消息
Apr 11 Python
python中列表元素连接方法join用法实例
Apr 07 Python
Python素数检测的方法
May 11 Python
Python运算符重载用法实例分析
Jun 01 Python
python列表操作之extend和append的区别实例分析
Jul 28 Python
Python中pow()和math.pow()函数用法示例
Feb 11 Python
对Python捕获控制台输出流的方法详解
Jan 07 Python
Python制作动态字符图的实例
Jan 27 Python
python3使用腾讯企业邮箱发送邮件的实例
Jun 28 Python
Django模板标签{% for %}循环,获取制定条数据实例
May 14 Python
Keras自定义实现带masking的meanpooling层方式
Jun 16 Python
Python在后台自动解压各种压缩文件的实现方法
Nov 10 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/01/14 PHP
使用PHP和HTML5 FormData实现无刷新文件上传教程
2014/09/06 PHP
Zend Framework自定义Helper类相关注意事项总结
2016/03/14 PHP
ThinkPHP删除栏目(实现批量删除栏目)
2017/06/21 PHP
php使用redis的几种常见操作方式和用法示例
2020/02/20 PHP
Jquery下的26个实用小技巧(jQuery tips, tricks &amp; solutions)
2010/03/01 Javascript
原生javascript实现Tab选项卡切换功能
2015/01/12 Javascript
JS实现同一个网页布局滑动门和TAB选项卡实例
2015/09/23 Javascript
解析Node.js异常处理中domain模块的使用方法
2016/02/16 Javascript
郁闷!ionic中获取ng-model绑定的值为undefined如何解决
2016/08/27 Javascript
AngularJS ng-repeat数组有重复值的解决方法
2016/10/23 Javascript
Agularjs妙用双向数据绑定实现手风琴效果
2017/05/26 Javascript
JavaScript之排序函数_动力节点Java学院整理
2017/06/30 Javascript
详细AngularJs4的图片剪裁组件的实例
2017/07/12 Javascript
js+html获取系统当前时间
2017/11/10 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
2018/01/05 Javascript
vue-swiper的使用教程
2018/08/30 Javascript
代码实例ajax实现点击加载更多数据图片
2018/10/12 Javascript
微信小程序实现星级评价效果
2018/12/28 Javascript
jQuery实现的点击显示隐藏下拉菜单功能完整示例
2019/05/17 jQuery
微信小程序页面间跳转传参方式总结
2019/06/13 Javascript
angular6开发steps步骤条组件
2019/07/04 Javascript
Echarts实现多条折线可拖拽效果
2019/12/19 Javascript
微信小程序选择图片控件
2021/01/19 Javascript
Python实现PS图像调整之对比度调整功能示例
2018/01/26 Python
python实现聚类算法原理
2018/02/12 Python
详解python调用cmd命令三种方法
2019/07/08 Python
使用python实现画AR模型时序图
2019/11/20 Python
详解Python中的format格式化函数的使用方法
2019/11/20 Python
高三历史教学反思
2014/01/09 职场文书
高一家长会邀请函
2014/01/12 职场文书
组织鉴定材料
2014/06/02 职场文书
日语专业求职信
2014/07/04 职场文书
意外死亡赔偿协议书
2014/10/14 职场文书
中学生勤俭节约倡议书
2015/04/29 职场文书
浅谈resultMap的用法及关联结果集映射
2021/06/30 Java/Android