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
#忽略表頭
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