python循环打开EXCEL文档,向mysql写入数据,开始很快,后来越来越慢怎么处理?

python循环打开EXCEL文档,向mysql写入数据,开始很快,后来越来越慢怎么处理?

我这里有个需求,是读取30个表格的内容,然后写入数据库,我使用的是for循环打开这些表格,如果使用for循环的话,开始很快,后来会越来越慢。
单次运行的话速度也很快,读取一个表格写入数据库的时间大概在200s左右。请问一下,这个是什么问题?如何解决?
mysql中的d建立了索引

import pymysql

from openpyxl import load_workbook

def read_excel(p):

# p = '26'

db = pymysql.Connect(host="localhost",port=3306,user="test",passwd="123456",db="test",charset="utf8")

cur = db.cursor()

excel = r'E:\整理数据\4月\1 ({}).xlsx'.format(p)

wb = load_workbook(excel)

ws = wb.active

rows = ws.max_row

#print(rows)

for i in range(2,rows):

d = ws['G%s' %i].value

fb = ws['F%s' %i].value

kh = ws['BB%s' %i].value

wdzl = ws['AV%s' %i].value

zxzl = ws['AW%s' %i].value

jpzl = ws['AU%s' %i].value

jszl = ws['AT%s' %i].value

jpinfo = ws['AX%s' %i].value

ywtime = ws['J%s' %i].value

try:

sql = "select dh from testdata where d = '{}'".format(d)

cur.execute(sql)

tid = cur.fetchone()

if tid == None:

print('新数据')

# 向数据库写入新数据

input_sql = "insert into testdata(d,fb,kh,wdzl,zxzl,jpzl,jszl,jpinfo,ywtime) values('{}','{}','{}','{}','{}','{}','{}','{}','{}')".format(d,fb,kh,wdzl,zxzl,jpzl,jszl,jpinfo,ywtime)

cur.execute(input_sql)

db.commit()

print(i,d,fb,wdzl,zxzl,jpzl,jszl,jpinfo,ywtime)

else:

print('数据已存在')

sql1 = "select wdzl,zxzl,jszl,jpzl,jpinfo from testdata where d = '{}'".format(d)

cur.execute(sql1)

w = cur.fetchone()

print(w)

if wdzl != '0' and w[0] == '0':

up_sql = "update testdata set wdzl = {} where d = '{}'".format(wdzl,d)

cur.execute(up_sql)

db.commit()

else:

pass

if zxzl != '0' and w[1] == '0':

up_sql = "update testdata set zxzl = '{}' where d = '{}'".format(zxzl,d)

cur.execute(up_sql)

db.commit()

else:

pass

if jszl != '0' and w[2] == '0':

up_sql = "update testdata set jszl = '{}' where d = '{}'".format(jszl,d)

cur.execute(up_sql)

db.commit()

else:

pass

if jpzl != '0' and w[3] == '0':

up_sql = "update testdata set jpzl = '{}' where d = '{}'".format(jpzl,d)

cur.execute(up_sql)

db.commit()

else:

pass

if jpinfo != '0' and w[4] == '0':

up_sql = "update testdata set jpinfo = '{}' where d = '{}'".format(jpinfo,d)

cur.execute(up_sql)

db.commit()

else:

pass

print(d)

except Exception as e:

print(e,d)

print('-'*50)

print(p,'号数据已完成')

cur.close()

db.close()

# for i in range(4,31):

# read_excel(i)

read_excel('17')


回答:

不要print,这个速度慢可能是因为print


回答:

openpyxl似乎不会主动释放内存,每个文件读取完后,手动释放内存试一下:

import gc

...

del wb,ws

gc.collect()


回答:

推测的话,openpyxl的根据行号列号读取的时候,是从第一行第一列开始遍历,直到行号等于指定行号,列号等于指定列号,所以要读取的行号列号越多就越慢,(也可能是从第一个有数据的行或列),而xlrd则是类似与数组一样,我们要取第几个元素,直接根据下标找到内存中对应地址的元素即可,所以无论excel总量多少,速度基本都是不变的。

楼上说的也不错,可以试试。

以上是 python循环打开EXCEL文档,向mysql写入数据,开始很快,后来越来越慢怎么处理? 的全部内容, 来源链接: utcz.com/p/938059.html

回到顶部