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 相关文章推荐
关于你不想知道的所有Python3 unicode特性
Nov 28 Python
python中global用法实例分析
Apr 30 Python
Python中使用插入排序算法的简单分析与代码示例
May 04 Python
KMP算法精解及其Python版的代码示例
Jun 01 Python
详解python之简单主机批量管理工具
Jan 27 Python
Python实现读取文件最后n行的方法
Feb 23 Python
python安装pywin32clipboard的操作方法
Jan 24 Python
tensorflow 动态获取 BatchSzie 的大小实例
Jun 30 Python
深入了解NumPy 高级索引
Jul 24 Python
对Python 字典元素进行删除的方法
Jul 31 Python
Python re.sub 反向引用的实现
Jul 07 Python
浅析python中特殊文件和特殊函数
Feb 24 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
解析关于wamp启动是80端口被占用的问题
2013/06/21 PHP
php中利用str_pad函数生成数字递增形式的产品编号
2013/09/30 PHP
thinkPHP中验证码的简单使用方法
2015/12/26 PHP
php similar_text()函数的定义和用法
2016/05/12 PHP
直接生成打开窗口代码,不必下载
2008/05/14 Javascript
javascript解析json实例详解
2014/11/05 Javascript
AngularJS基础教程之简单介绍
2015/09/27 Javascript
jQuery无刷新切换主题皮肤实例讲解
2015/10/21 Javascript
jQuery设置聚焦并使光标位置在文字最后的实现方法
2016/08/02 Javascript
nodejs前端自动化构建环境的搭建
2017/07/26 NodeJs
js实现鼠标单击Tab表单切换效果
2018/05/16 Javascript
基于webpack4+vue-cli3项目实现换肤功能
2019/07/17 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
详解js创建对象的几种方式和对象方法
2021/03/01 Javascript
[02:47]DOTA2亚洲邀请赛 HR战队出场宣传片
2015/02/07 DOTA
Python 深入理解yield
2008/09/06 Python
python数据结构之二叉树的遍历实例
2014/04/29 Python
python 全文检索引擎详解
2017/04/25 Python
Python操作Redis之设置key的过期时间实例代码
2018/01/25 Python
python使用pyecharts库画地图数据可视化的实现
2020/03/25 Python
使用HTML5拍照示例代码
2013/08/06 HTML / CSS
HTML5 canvas基本绘图之绘制五角星
2016/06/27 HTML / CSS
日本非常有名的内衣丝袜品牌:GUNZE
2017/01/06 全球购物
日本索尼音乐商店:Sony Music Shop
2018/07/17 全球购物
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
理工科学生的自我评价
2013/12/15 职场文书
新学期开学寄语
2014/01/18 职场文书
关于安全演讲稿
2014/05/09 职场文书
小学优秀班干部事迹材料
2014/05/25 职场文书
国际商贸专业自荐信
2014/06/09 职场文书
大学军训的体会
2014/11/08 职场文书
居委会工作总结2015
2015/05/18 职场文书
2015年秋季校长开学典礼致辞
2015/07/29 职场文书
python中出现invalid syntax报错的几种原因分析
2022/02/12 Python
Python中的嵌套循环详情
2022/03/23 Python
使用JS前端技术实现静态图片局部流动效果
2022/08/05 Javascript