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的URLconf中进行函数导入的方法
Jul 18 Python
python实现中文转换url编码的方法
Jun 14 Python
使用pandas对两个dataframe进行join的实例
Jun 08 Python
flask框架实现连接sqlite3数据库的方法分析
Jul 16 Python
在Pycharm中项目解释器与环境变量的设置方法
Oct 29 Python
Django文件存储 自己定制存储系统解析
Aug 02 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
Aug 12 Python
numpy:找到指定元素的索引示例
Nov 26 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
Dec 25 Python
python 实现rolling和apply函数的向下取值操作
Jun 08 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
Jun 11 Python
python+selenium实现12306模拟登录的步骤
Jan 21 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/11/09 PHP
php验证码实现代码(3种)
2015/09/07 PHP
php字符串操作常见问题小结
2016/10/11 PHP
thinkPHP自动验证、自动添加及表单错误问题分析
2016/10/17 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
2016/10/31 PHP
PHP常用函数之base64图片上传功能详解
2019/10/21 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
2020/02/11 PHP
锋利的jQuery 要点归纳(一) jQuery选择器
2010/03/21 Javascript
基于JQuery的模拟苹果桌面Dock效果(稳定版)
2012/10/15 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
vue.js利用defineProperty实现数据的双向绑定
2017/04/28 Javascript
Angular.Js中过滤器filter与自定义过滤器filter实例详解
2017/05/08 Javascript
使用angular帮你实现拖拽的示例
2017/07/05 Javascript
VUE2.0+Element-UI+Echarts封装的组件实例
2018/03/02 Javascript
jQuery实现鼠标点击处心形漂浮的炫酷效果示例
2018/04/12 jQuery
vue.js提交按钮时进行简单的if判断表达式详解
2018/08/08 Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
2019/04/01 Javascript
Vue CLI3基础学习之pages构建多页应用
2019/06/02 Javascript
[03:03]DOTA2校园争霸赛 济南城市决赛欢乐发奖活动
2013/10/21 DOTA
Python实现统计单词出现的个数
2015/05/28 Python
Python给你的头像加上圣诞帽
2018/01/04 Python
python list转置和前后反转的例子
2019/08/26 Python
Window系统下Python如何安装OpenCV库
2020/03/05 Python
Html5跳转到APP指定页面的实现
2020/01/14 HTML / CSS
Lookfantastic澳大利亚官网:英国知名美妆购物网站
2021/01/07 全球购物
Sahajan美国:阿育吠陀护肤品牌
2021/01/09 全球购物
施工资料员的岗位职责
2013/12/22 职场文书
主题酒店策划书
2014/01/28 职场文书
合唱兴趣小组活动总结
2014/07/10 职场文书
2014年仓库工作总结
2014/11/20 职场文书
绍兴鲁迅故居导游词
2015/02/09 职场文书
置业顾问岗位职责
2015/02/09 职场文书
2016年全国爱牙日宣传活动总结
2016/04/05 职场文书
导游词之山东孔庙
2019/11/04 职场文书
Redis缓存-序列化对象存储乱码问题的解决
2021/06/21 Redis
Docker 镜像介绍以及commit相关操作
2022/04/13 Servers