python:excel批量导入数据到mysql工具方法

近期批量数据对账,经常收到客户提供的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建表、执行导入等操作了,直接运行脚本、指定表名,一键搞定,知识就是生产力。

你可能感兴趣的:(python:excel批量导入数据到mysql工具方法)