《中学生可以这样学Python》P201-204
批量Excel文件中的数据快速导入SQLite数据库
##SQLite数据库例题
## 批量Excel文件中的数据快速导入SQLite数据库
# generateRandomData()生成50个Excel2007+文件,命名为如0.xlsx
# 每个文件若干行,每行5列,每列30个随机字符
# eachXlsx()把Excel文件数据导入数据库
from random import choice,randrange
from string import digits,ascii_letters
from os import listdir,mkdir
from os.path import isdir
import sqlite3
from time import time
from openpyxl import Workbook,load_workbook
def generateRandomData():
#如果不存在xlsxs文件夹 就创建一个
if not isdir('xlsxs'):
mkdir('xlsxs')
#全局变量total 记录总条数
global total
#total=0
#所有大小写英文字母和数字
characters=digits+ascii_letters
for i in range(50):
#生成的Excel文件名,要求当前文件夹中已有子文件夹xlsxs
xlsName='xlsxs\\{}.xlsx'.format(str(i))
#随机数 每个xlsx文件的行数不一样
totalLines=randrange(10)
total=total+totalLines
#创建Excel工作簿和工作表
wb=Workbook()
ws=wb.worksheets[0]
#写入表头
ws.append(['a','b','c','d','e'])
#随机数据 每行5个字段 每个字段30个字符
for j in range(totalLines):
#列表生成器,生成5个字符串 米格字符串30个随机字符
line=[''.join((choice(characters) for ii in range(30))) for jj in range(5)]
#在Excel工作表中增加一行,并插入上面的5个字符串
ws.append(line)
#total += 1
#保存xlsx文件
wb.save(xlsName)
#针对每个xlsx文件的生成器 每次调用函数时返回一行数据
def eachXlsx(xlsxFn):
#打开excel文件 并获取下标为0的第一个工作表
wb=load_workbook(xlsxFn)
ws=wb.worksheets[0]
#遍历excel文件的所有行
for index,row in enumerate(ws.rows):
#忽略表头,下标为0的第一行不读取
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('database.db')
cur=conn.cursor()
try:
cur.execute('CREATE TABLE fromxlsx(a,b,c,d,e)')
except:
pass
for xlsx in xlsxs:
#批量导入 减少提交事务的次数,可以提高速度
sql='INSERT INTO fromxlsx VALUES(?,?,?,?,?)'
cur.executemany(sql,eachXlsx(xlsx))
conn.commit()
#获取数据库内前n条数据
def check(n):
conn=sqlite3.connect('database.db')
cur=conn.cursor()
cur.execute('SELECT * FROM fromxlsx LIMIT {}'.format(n))
for i in cur.fetchall():
print(i)
total=0
generateRandomData()
start=time()
xlsx2sqlite()
delta=time()-start
print('导入用时:',delta)
print('导入速度(条/秒):',total/delta)
结果:
>>> %Run test9.py
导入用时: 24.648041248321533
导入速度(条/秒): 9.818224400142935
>>> check(2)
('fdjgKtKTAaCsKg8BAJ84bIn66CDgt3', 'jtGsQuOa3Phopr9bLFYd83P4HCdzEs', 'EMwUCB6J1vTJnUkpoi6ZlmBD4RpV6P', 'yvWB48pkTnCyT4jJrvTvg0emZgLGGK', 'rST2tF9GWOkLNDnStE8dUriJrZznBU')
('r6d2ujI1IFYW2eXUChtPxXnkV8w2RQ', 'keloTTUjDVu3Y8nM43gBdCVFkm4XgO', 'oe5bCRd0Ax2FbAjDwyysdxC0ZpiyP4', 'OZbz0FU6u7hgxzeiYEE849FTZm0AFy', 'yboqUA7kqEaxL4IumEjKOWhWMKswcm')
>>>