您当前的位置:首页 > 计算机 > 编程开发 > Python

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

时间:12-24来源:作者:点击数:

说明: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

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门