Python批量Excel文件数据导入SQLite数据库的优化方案

December 17, 2023
测试
测试
测试
测试
4 分钟阅读

说明:1)需要安装扩展库openpyxl;2)随着数据库的增大,导入速度可能会有所下降;3)本文只考虑Python代码优化,没有涉及数据库的优化;4)本文要点在于使用executemany实现批量数据导入,通过减少事务提交次数提高导入速度。

from random import choice, randrange from string import digits, ascii_letters from os import listdir import sqlite3 from time import time from openpyxl import Workbook, load_workbook

def generateRandomData(): #total表示记录总条数 global total characters = digits+ascii_letters for i in range(50): xlsName = 'xlsxs\\'+str(i)+'.xlsx' #随机数,每个xlsx文件的行数不一样 totalLines = randrange(10**5) wb = Workbook() ws = wb.worksheets[0] #表头 ws.append(['a', 'b', 'c', 'd', 'e']) #随机数据,每行5个字段,每个字段30个字符 for j in range(totalLines): line = [''.join((choice(characters) for ii in range(30))) for jj in range(5)] ws.append(line) total += 1 #保存xlsx文件 wb.save(xlsName)

#针对每个xlsx文件的生成器 def eachXlsx(xlsxFn): wb = load_workbook(xlsxFn) ws = wb.worksheets[0] for index, row in enumerate(ws.rows): #忽略表头 if index == 0: continue yield tuple(map(lambda x:x.value, row))

#导入 def xlsx2sqlite(): #获取所有xlsx文件 xlsxs = ('xlsxs\\'+fn for fn in listdir('xlsxs')) #连接数据库,创建游标 conn = sqlite3.connect('data.db') cur = conn.cursor() for xlsx in xlsxs: #批量导入,减少提交事务的次数,可以提高速度 sql = 'insert into fromxlsx values(?,?,?,?,?)' cur.executemany(sql, eachXlsx(xlsx)) conn.commit()

total = 0

generateRandomData()

start = time() xlsx2sqlite() delta = time()-start print('导入用时:', delta) print('导入速度(条/秒):', total/delta)

运行结果:

导入用时: 326.4754948616028 导入速度(条/秒): 7105.5317673486825

继续阅读

更多来自我们博客的帖子

如何安装 BuddyPress
由 测试 December 17, 2023
经过差不多一年的开发,BuddyPress 这个基于 WordPress Mu 的 SNS 插件正式版终于发布了。BuddyPress...
阅读更多
Filter如何工作
由 测试 December 17, 2023
在 web.xml...
阅读更多
如何理解CGAffineTransform
由 测试 December 17, 2023
CGAffineTransform A structure for holding an affine transformation matrix. ...
阅读更多