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面向对象编程中的类和对象学习教程
Mar 30 Python
Python中的各种装饰器详解
Apr 11 Python
浅析Python中的for 循环
Jun 09 Python
在pycharm中python切换解释器失败的解决方法
Oct 29 Python
对numpy中向量式三目运算符详解
Oct 31 Python
Django之Mode的外键自关联和引用未定义的Model方法
Dec 15 Python
使用python读取.text文件特定行的数据方法
Jan 28 Python
python+selenium实现自动化百度搜索关键词
Jun 03 Python
在notepad++中实现直接运行python代码
Dec 18 Python
解决Python使用列表副本的问题
Dec 19 Python
Python3 虚拟开发环境搭建过程(图文详解)
Jan 06 Python
Django多数据库联用实现方法解析
Nov 12 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 和 MySQL 基础教程(三)
2006/10/09 PHP
php 中的str_replace 函数总结
2007/04/27 PHP
浅析PHP中Collection 类的设计
2013/06/21 PHP
PHP防止注入攻击实例分析
2014/11/03 PHP
Laravel5中contracts详解
2015/03/02 PHP
PHP实现根据时间戳获取周几的方法
2016/02/26 PHP
JavaScript写的一个DIV 弹出网页对话框
2009/08/14 Javascript
javascript实现仿IE顶部的可关闭警告条
2015/05/05 Javascript
轻量级javascript 框架Backbone使用指南
2015/07/24 Javascript
javascript中的altKey 和 Event属性大全
2015/11/06 Javascript
图解Sublime Text3使用技巧
2015/12/21 Javascript
JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)
2017/07/07 Javascript
JavaScript门面模式详解
2017/10/19 Javascript
js插件实现图片滑动验证码
2020/09/29 Javascript
原生javascript实现连连看游戏
2019/01/03 Javascript
javascript for循环性能测试示例
2019/08/07 Javascript
基于JS正则表达式实现模板数据动态渲染(实现思路详解)
2020/03/07 Javascript
微信小程序pinker组件使用实现自动相减日期
2020/05/07 Javascript
JavaScript随机数的组合问题案例分析
2020/05/16 Javascript
[45:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第二场 6.2
2018/06/04 DOTA
python文件和目录操作方法大全(含实例)
2014/03/12 Python
Python WXPY实现微信监控报警功能的代码
2017/10/20 Python
Python实现XML文件解析的示例代码
2018/02/05 Python
python的常用模块之collections模块详解
2018/12/06 Python
pygame实现弹球游戏
2020/04/14 Python
解决python运行效率不高的问题
2020/07/20 Python
详解python日志输出使用配置文件格式
2021/02/10 Python
CAT鞋英国官网:坚固耐用的靴子和鞋
2016/10/21 全球购物
加拿大领先的优质厨具产品在线购物网站:Golda’s Kitchen
2017/11/17 全球购物
意大利在线眼镜精品店:Ottica Lipari
2019/11/11 全球购物
2014法院四风问题对照检查材料思想汇报
2014/10/04 职场文书
2015年元旦联欢晚会活动总结
2014/11/28 职场文书
2014幼儿园卫生保健工作总结
2014/12/05 职场文书
2015年精神文明建设工作总结
2015/04/21 职场文书
2019入党申请书格式
2019/06/25 职场文书
Python绘画好看的星空图
2022/03/17 Python