本文實例講述了Python實現(xiàn)簡單的多任務(wù)mysql轉(zhuǎn)xml的方法。分享給大家供大家參考,具體如下:
為了需求導(dǎo)出的格式盡量和navicat導(dǎo)出的xml一致。
用的gevent,文件i/o操作會阻塞,所以并不會完全異步。
1. mysql2xml.py:
# -*- coding: utf-8 -*-'''Created on 2014/12/27@author: Yoki'''import geventimport pymysqlfrom pymysql.cursors import DictCursorimport reimport codecsdb_conn = Nonedef init_mysql_connect(*args, **kwargs): global db_conn db_conn = pymysql.connect(*args, **kwargs)def list_to_xml(result_cur, key_list): ''' mysql 結(jié)果集轉(zhuǎn)xml,非xml標(biāo)準(zhǔn)導(dǎo)出方式; 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節(jié)點(diǎn) 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 contentdef 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 rowsdef get_table_keys(tb_name): ''' 獲取表中字段,順序 為創(chuàng)建表時的順序 :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數(shù)據(jù)導(dǎo)出xml, :param tb_name: 數(shù)據(jù)庫表名 :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函數(shù)修改,速度提升上百倍
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()更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python+MySQL數(shù)據(jù)庫程序設(shè)計入門教程》、《Python常見數(shù)據(jù)庫操作技巧匯總》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設(shè)計有所幫助。
新聞熱點(diǎn)
疑難解答
圖片精選