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

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

时间:2023-06-09 21:04:25浏览次数:45  
标签:xlsx SQLite wb Python Excel 导入 ws import total


说明: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
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
#导入
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

标签:xlsx,SQLite,wb,Python,Excel,导入,ws,import,total
From: https://blog.51cto.com/u_9653244/6451081

相关文章

  • Python求解进制问题(阿里巴巴2015笔试题)
    问题描述:用十进制计算30的阶乘,然后把结果转换成三进制表示,那么该进制表示的结果末尾会有多少个连续0?解析:作为笔试题的话,要想按照题意先把阶乘结果计算出来再转换成三进制最后再数0的个数,时间肯定来不及。也就是说,应该是有更简单的方法。以我们最熟悉的十进制为例,一个数乘以10相当于......
  • Python中直接查看对象值和使用print()输出的区别
    直接用代码来描述这个问题的现象:>>>x=r'C:\windows\notepad.exe'>>>x'C:\\windows\\notepad.exe'>>>print(x)C:\windows\notepad.exe>>>x='''Tomsaid,"Let'sgo."'......
  • Python提取彩色图像的二值化边缘
    所谓二值化是指只包含白和黑这两种颜色,下面的代码中使用白色表示内部或背景,使用黑色表示边缘。图像边缘提取的基本思路是:如果一个像素的颜色值与周围像素足够接近(属于低频部分)则认为是图像背景或者内部,如果一个像素的颜色值与周围像素相差很大(属于高频部分)则认为是图像边缘。在具体......
  • Python+SQLite开发无界面版通信录管理系统
    本文重点在于演示Python对SQLite数据库的操作,以及命令行式菜单的工作原理和实现。首先使用SQLiteDatabaseBrowser创建SQLite数据库data.db,然后创建一个数据表addressList,最后在数据表addressList中创建字段id(INTEGERPRIMARYKEY类型)、name(TEXT类型)、sex(TEXT类型)、age(NUMERIC类型......
  • 妙用Python集合求解啤酒问题(携程2016笔试题)
    问题描述:一位酒商共有5桶葡萄酒和1桶啤酒,6个桶的容量分别为30升、32升、36升、38升、40升和62升,并且只卖整桶酒,不零卖。第一位顾客买走了2整桶葡萄酒,第二位顾客买走的葡萄酒是第一位顾客的2倍。那么,本来有多少升啤酒呢?解析:由于该酒商只卖整桶酒,简单分析几个桶的容量可知,第二位顾客......
  • Python两种方法求解登楼梯问题(京东2016笔试题)
    问题:假设一段楼梯共15个台阶,小明一步最多能上3个台阶,那么小明上这段楼梯一共有多少种方法?解析:从第15个台阶上往回看,有3种方法可以上来(从第14个台阶上一步迈1个台阶上来,从第13个台阶上一步迈2个台阶上来,从第12个台阶上一步迈3个台阶上来),同理,第14个、13个、12个台阶都可以这样推算,从......
  • 大数据分析python
    #导库importnumpyasnpimportpandasaspd#读取数据data=pd.read_csv('logistics.csv')data.head(10)思路:直接查看不同公司的数量即可df1=data.groupby('货运公司名称').size().reset_index(name='count')#直接对货运公司的名称做统计(示例:天天速递25)df12.接通知对......
  • 使用Python编写简易定时器
    简单模拟了定时器功能,需要的朋友可以自己改写和扩充功能。importdatetimeimportwinsoundimporttimeimportrandomdefTimer(y,m,d,h,mu,s):'''参数分别为年、月、日、时、分、秒'''stopTime=datetime.datetime(y,m,d,h,mu,s)maxTime=stopTime+......
  • 使用Python寻找黑洞数
     黑洞数是指这样的整数:由这个数字每位上的数字组成的最大数减去每位数字组成的最小数仍然得到这个数自身。例如3位黑洞数是495,因为954-459=495,4位数字是6174,因为7641-1467=6174。本文重点在于内置函数sorted()和reversed()的用法。defmain(n):'''参数n表示数字的位数,例如n=3......
  • Python中的具名元组类用法
    >>>fromcollectionsimportnamedtuple>>>Point=namedtuple('Point',['x','y','z'])#创建具名元组类>>>Point<class'__main__.Point'>>>>p=Point(3,4,5)#实例化对象......