【python学习】SQLite数据库例题——批量Excel文件中的数据快速导入SQLite数据库

《中学生可以这样学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')
>>> 
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值