近期批量数据对账,经常收到客户提供的excel要求对数,每次通过excel处理非常不方便,所以想利用python脚本,来帮忙处理,对于大批量数据,从excel导入到mysql数据库处理非常方便,但从文件导入到excel步骤也很多,比较麻烦,想偷懒,做到拿到excel直接建表入库数据一条龙搞定,想起来就做,趁周末1个小时左右搞定脚本,基本可以满足需求,分享记录下来。
需求:选择入库的excel数据文件,指定表名,自动建表并将数据入库到表中。
实现:
1、利用python的xlrd库实现excel文件的操作,mysql的MySQLdb链接数据库操作;
2、以excel数据第1条表头的字段为库表名,自动创建库表,入库第1条之后的所有数据,为提高性能,批量插入。
代码:
import MySQLdb
import xlrd
import re
import time
import datetime
#这个函数用来判断表是否存在
def table_exists(con,table_name):
sql= "show tables;"
con.execute(sql)
tables= [con.fetchall()]
table_list= re.findall('(\'.*?\')',str(tables))
table_list= [re.sub("'",'',each)for eachin table_list]
if table_name in table_list:
return 1
else:
return 0
# 创建库表
def create_table(cur,sheet,table_name):
#判断表是否存在
if (table_exists(cur, table_name)!= 1):
print("1--库表{}不存在,新建库表!".format(table_name))
else:
print("1--库表{}已存在,删除重建!".format(table_name))
cur.execute("drop table if exists {}".format(table_name))
#exit()
create_table_sql= "create table {}( ".format(table_name)
insert_sql= 'insert into {} ('.format(table_name)
# 拼装create table语句,取excel第一行做库表的字段名称
first_row= sheet.row(0)
for iin range(0, len(first_row)):
# 剔除表头中特殊字符,影响建表语句执行
column_name= first_row[i].value.replace('(', '').replace(')', '').replace('-', '')
if i== len(first_row)- 1:
create_table_sql= create_table_sql+ "{} varchar(255) )".format(column_name)
insert_sql= insert_sql+ '{} )'.format(column_name)
else:
create_table_sql= create_table_sql+ "{} varchar(255) ,".format(column_name)
insert_sql= insert_sql+ '{} ,'.format(column_name)
cur.execute(create_table_sql)
print('2--表已创建成功!')
return insert_sql+" values"
# 批量插入数据到库表中
def insert_table(cur, sheet, table_name,insert_sql):
print('3--待入库记录总数:',sheet.nrows-1)
begintime= datetime.datetime.now()
# 取列表数据,从第1行开始,0行作为表字段名
sql_values= ' '
for iin range(1,sheet.nrows):
sql_values+= '( '
#得到行数据
row_values= sheet.row_values(i)
for jin range(len(row_values)):
ctype= sheet.cell(i,j).ctype
value= sheet.cell(i,j).value
#类型如果为数字,则变为整形,否则会有.0情况
if ctype==2 and value% 1==0:
value= int(value)
if j== len(row_values)-1:
#str += row_values[j]
sql_values+= "'"+str(value)+"'"+')'
else:
sql_values+= "'"+str(value)+"'"+','
if i== sheet.nrows-1:
sql_values+= ''
else:
sql_values+= ','
# 获取拼装后的批量sql
exec_sql= insert_sql + sql_values
cur.execute(exec_sql)
endtime= datetime.datetime.now()
print('4--入库成功记录总数:',sheet.nrows-1,',消耗时间:',(endtime-begintime).seconds)
#导入数据
def importToMysql(import_file,table_name):
# 连接数据库,查询数据
db= MySQLdb.connect(host="127.0.0.1", port=3306, user="root", passwd="root", db="test",charset='GBK')
# 使用cursor()方法获取操作游标
cur= db.cursor()
book= xlrd.open_workbook(import_file)
sheet= book.sheet_by_index(0)
if sheet.nrows>0:
# 创建库表
insert_sql= create_table(cur, sheet, table_name)
#插入数据
insert_table(cur, sheet, table_name, insert_sql)
else:
print('文件为空,无需导入')
cur.close()
db.commit()
db.close()
if __name__== '__main__':
importToMysql("test.xlsx",'test4')
执行测试,结果如下:
2.8万数据,入库执行9秒,速度算比较快了。
后期不用繁琐的到mysql建表、执行导入等操作了,直接运行脚本、指定表名,一键搞定,知识就是生产力。