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 相关文章推荐
将Django框架和遗留的Web应用集成的方法
Jul 24 Python
关于Python面向对象编程的知识点总结
Feb 14 Python
python九九乘法表的实例
Sep 26 Python
使用python爬虫实现网络股票信息爬取的demo
Jan 05 Python
python opencv3实现人脸识别(windows)
May 25 Python
Python Numpy库安装与基本操作示例
Jan 08 Python
python爬虫基础教程:requests库(二)代码实例
Apr 09 Python
django数据库自动重连的方法实例
Jul 21 Python
Django用户认证系统 组与权限解析
Aug 02 Python
Django对models里的objects的使用详解
Aug 17 Python
在pycharm中为项目导入anacodna环境的操作方法
Feb 12 Python
高考要来啦!用Python爬取历年高考数据并分析
Jun 03 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
关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法
2013/06/28 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
2014/09/23 PHP
简单的自定义php模板引擎
2016/08/26 PHP
Laravel中使用Queue的最基本操作教程
2017/12/27 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
2019/04/02 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
jQuery Autocomplete自动完成插件
2010/07/17 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
2014/08/04 Javascript
使用javascript实现雪花飘落的效果
2015/01/13 Javascript
JQuery中绑定事件(bind())和移除事件(unbind())
2015/02/27 Javascript
小心!AngularJS结合RequireJS做文件合并压缩的那些坑
2016/01/09 Javascript
javascript解决小数的加减乘除精度丢失的方案
2016/05/31 Javascript
jQuery的deferred对象使用详解
2016/09/25 Javascript
VUE使用vuex解决模块间传值问题的方法
2017/06/01 Javascript
详解webpack import()动态加载模块踩坑
2018/07/17 Javascript
微信小程序常见页面跳转操作简单示例
2019/05/01 Javascript
jQuery中DOM常见操作实例小结
2019/08/01 jQuery
vue结合el-upload实现腾讯云视频上传功能
2020/07/01 Javascript
基于javascript的无缝滚动动画1
2020/08/07 Javascript
python中元类用法实例
2014/10/10 Python
Python中的左斜杠、右斜杠(正斜杠和反斜杠)
2016/08/30 Python
python制作爬虫爬取京东商品评论教程
2016/12/16 Python
Python+pandas计算数据相关系数的实例
2018/07/03 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
2020/04/10 Python
python如何进行矩阵运算
2020/06/05 Python
我为自己代言广告词
2014/03/18 职场文书
奥林匹克运动会口号
2014/06/19 职场文书
小学生十佳少年事迹材料
2014/08/20 职场文书
考试保密承诺书
2014/08/30 职场文书
作风整顿个人剖析材料
2014/10/06 职场文书
缓刑期间思想汇报范文
2014/10/10 职场文书
2015年行政部工作总结
2015/04/28 职场文书
搞笑婚礼主持词开场白
2015/11/24 职场文书
MySQL时间盲注的五种延时方法实现
2021/05/18 MySQL
JavaScript实现音乐播放器
2022/08/14 Javascript