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数据结构之二叉树的建立实例
Apr 29 Python
Python的类实例属性访问规则探讨
Jan 30 Python
Python中文分词实现方法(安装pymmseg)
Jun 14 Python
教你用python3根据关键词爬取百度百科的内容
Aug 18 Python
Python多线程经典问题之乘客做公交车算法实例
Mar 22 Python
关于python pyqt5安装失败问题的解决方法
Aug 08 Python
python去除扩展名的实例讲解
Apr 23 Python
python七夕浪漫表白源码
Apr 05 Python
Pytorch中的variable, tensor与numpy相互转化的方法
Oct 10 Python
python线程定时器Timer实现原理解析
Nov 30 Python
python使用Thread的setDaemon启动后台线程教程
Apr 25 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
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
用PHP调用数据库的存贮过程
2006/10/09 PHP
php 服务器调试 Zend Debugger 的安装教程
2009/09/25 PHP
php中CI操作多个数据库的代码
2012/07/05 PHP
php中FTP函数ftp_connect、ftp_login与ftp_chmod用法
2014/11/18 PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
2015/09/20 PHP
smarty中改进truncate使其支持中文的方法
2016/05/30 PHP
php fread读取文件注意事项
2016/09/24 PHP
PHP使用SOAP调用API操作示例
2018/12/25 PHP
php和vue配合使用技巧和方法
2019/05/09 PHP
javascript 面向对象编程 聊聊对象的事
2009/09/17 Javascript
Jquery加载时从后台读取数据绑定到dropdownList实例
2013/06/09 Javascript
输入框过滤非数字的js代码
2014/09/18 Javascript
EasyUi datagrid 实现表格分页
2015/02/10 Javascript
JavaScript实现表格点击排序的方法
2015/05/11 Javascript
javascript运算符语法全面概述
2016/07/14 Javascript
随机生成10个不重复的0-100的数字(实例讲解)
2017/08/16 Javascript
javascript将list转换成树状结构的实例
2017/09/08 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
2018/02/07 Javascript
JS立即执行函数功能与用法分析
2019/01/15 Javascript
Vue select 绑定动态变量的实例讲解
2020/10/22 Javascript
原生js实现滑块区间组件
2021/01/20 Javascript
python 性能提升的几种方法
2016/07/15 Python
详解Python实现按任意键继续/退出的功能
2016/08/19 Python
django实现同一个ip十分钟内只能注册一次的实例
2017/11/03 Python
Python 将RGB图像转换为Pytho灰度图像的实例
2017/11/14 Python
Python异常对代码运行性能的影响实例解析
2018/02/08 Python
python pygame实现2048游戏
2018/11/20 Python
python查看数据类型的方法
2019/10/12 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
2020/06/27 Python
python 下载文件的多种方法汇总
2020/11/17 Python
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
Marmot土拨鼠官网:美国专业户外运动品牌
2018/01/11 全球购物
集团公司总经理岗位职责
2013/12/20 职场文书
信仰观后感
2015/06/03 职场文书
数据库连接池
2021/04/06 MySQL
使用Django框架创建项目
2022/06/10 Python