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处理文本文件实现生成指定格式文件的方法
Jul 31 Python
Python命令行参数解析模块optparse使用实例
Apr 13 Python
python实现将文本转换成语音的方法
May 28 Python
Python数据分析中Groupby用法之通过字典或Series进行分组的实例
Dec 08 Python
python实现生成字符串大小写字母和数字的各种组合
Jan 01 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
Jun 12 Python
python对绑定事件的鼠标、按键的判断实例
Jul 17 Python
Python生命游戏实现原理及过程解析(附源代码)
Aug 01 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
Sep 23 Python
Python 中pandas索引切片读取数据缺失数据处理问题
Oct 09 Python
详解用selenium来下载小姐姐图片并保存
Jan 26 Python
tensorflow学习笔记之tfrecord文件的生成与读取
Mar 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 has encountered an Access Violation 错误的解决方法
2010/01/17 PHP
在PHP中使用curl_init函数的说明
2010/11/02 PHP
Web程序工作原理详解
2014/12/25 PHP
PHP中把有符号整型转换为无符号整型方法
2015/05/27 PHP
javascript 类方法定义还是有点区别
2009/04/15 Javascript
js实时监听文本框状态的方法
2011/04/26 Javascript
js判断上传文件的类型和大小示例代码
2013/10/18 Javascript
jQuery 动态云标签插件
2014/11/11 Javascript
jquery滚动到顶部底部代码
2015/04/20 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
2015/12/25 Javascript
javascript动态获取登录时间和在线时长
2016/02/25 Javascript
拥Bootstrap入怀——导航栏篇
2016/05/30 Javascript
AngularJS中$watch和$timeout的使用示例
2016/09/20 Javascript
JavaScript实现简单的树形菜单效果
2017/06/23 Javascript
Vue数据监听方法watch的使用
2018/03/28 Javascript
ES6关于Promise的用法详解
2018/05/07 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
2019/05/10 Javascript
Vue实现图片与文字混输效果
2019/12/04 Javascript
vue 清空input标签 中file的值操作
2020/07/21 Javascript
python清除字符串里非字母字符的方法
2015/07/02 Python
python Opencv将图片转为字符画
2021/02/19 Python
详谈python在windows中的文件路径问题
2018/04/28 Python
Sanic框架异常处理与中间件操作实例分析
2018/07/16 Python
Django代码性能优化与Pycharm Profile使用详解
2018/08/26 Python
python 实现一次性在文件中写入多行的方法
2019/01/28 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
2019/06/13 Python
Python实现一个数组除以一个数的例子
2019/07/20 Python
Python作用域与名字空间原理详解
2020/03/21 Python
pandas.DataFrame.drop_duplicates 用法介绍
2020/07/06 Python
电气自动化大学生求职信
2013/10/16 职场文书
单位办理社保介绍信
2014/01/10 职场文书
让生命充满爱演讲稿
2014/05/10 职场文书
2014年秋季开学典礼主持词
2014/08/02 职场文书
2015新员工试用期工作总结
2014/12/12 职场文书
小学校园广播稿
2015/08/18 职场文书
机关单位2016年创先争优活动总结
2016/04/05 职场文书