1. 程式人生 > >Python批量Excel檔案資料匯入SQLite資料庫的優化方案

Python批量Excel檔案資料匯入SQLite資料庫的優化方案

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