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爬虫之使用urllib2组件抓取网页内容
Nov 04 Python
python使用in操作符时元组和数组的区别分析
May 19 Python
Python连接数据库学习之DB-API详解
Feb 07 Python
Python编程pygal绘图实例之XY线
Dec 09 Python
Python设计模式之MVC模式简单示例
Jan 10 Python
hmac模块生成加入了密钥的消息摘要详解
Jan 11 Python
python matplotlib实现双Y轴的实例
Feb 12 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
Apr 04 Python
Django使用redis缓存服务器的实现代码示例
Apr 28 Python
Python tkinter三种布局实例详解
Jan 06 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
Mar 13 Python
用python批量解压带密码的压缩包
May 31 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中header和session_start前不能有输出原因分析
2013/01/11 PHP
php 模拟 asp.net webFrom 按钮提交事件实例
2014/10/13 PHP
php使用gettimeofday函数返回当前时间并存放在关联数组里
2015/03/19 PHP
Zend Framework教程之前端控制器Zend_Controller_Front用法详解
2016/03/07 PHP
两个select之间option的互相添加操作(jquery实现)
2009/11/12 Javascript
让ie运行js时提示允许阻止内容运行的解决方法
2010/10/24 Javascript
元素的内联事件处理函数的特殊作用域在各浏览器中存在差异
2011/01/12 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
javascript实现存储hmtl字符串示例
2014/04/25 Javascript
javascript匿名函数实例分析
2014/11/18 Javascript
教你JS中的运算符乘方、开方及变量格式转换
2016/08/09 Javascript
Angular开发者指南之入门介绍
2017/03/05 Javascript
利用Mongoose让JSON数据直接插入或更新到MongoDB
2017/05/03 Javascript
jQuery实现一个简单的验证码功能
2017/06/26 jQuery
nodejs实现一个word文档解析器思路详解
2018/08/14 NodeJs
监听element-ui table滚动事件的方法
2019/03/26 Javascript
全面分析JavaScript 继承
2019/05/30 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
2020/03/12 Javascript
[56:45]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第一局
2016/02/28 DOTA
[35:29]Secret vs VG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
python实现复制整个目录的方法
2015/05/12 Python
python实现n个数中选出m个数的方法
2018/11/13 Python
Python3 关于pycharm自动导入包快捷设置的方法
2019/01/16 Python
Python基础知识点 初识Python.md
2019/05/14 Python
python 随机生成10位数密码的实现代码
2019/06/27 Python
Python通用唯一标识符uuid模块使用案例
2020/09/10 Python
经典c++面试题三
2015/07/08 面试题
Internal修饰符有什么含义
2013/07/10 面试题
拓展培训心得体会
2014/01/04 职场文书
高三自我评价
2014/02/01 职场文书
集体婚礼策划方案
2014/02/22 职场文书
新闻发布会主持词
2014/03/28 职场文书
2015幼儿园新学期寄语
2015/02/27 职场文书
2015学校年度工作总结
2015/05/11 职场文书
宾馆客房管理制度
2015/08/06 职场文书
python实战之一步一步教你绘制小猪佩奇
2021/04/22 Python