首页 存档 技术 查看内容

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

2018-3-30 13:00 |来自: 互联网 1639 0

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

说明: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.EⅩEcutemany(sql, eachXlsx(xlsx))
conn.commit()


total = 0


generateRandomData()

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


运行结果:

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

本文转载于微信公众号: Python小屋(Python_xiaowu),更多微信文章请扫描关注公众号:

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部