欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python实现自动导入excel数据到MySQL中

程序员文章站 2022-06-11 10:52:32
...
  1. 最近工作遇到了把excel数据自动导入到MySQL的需求,在考虑了kettle后,不太容易实现导入excel数据自动生成表的问题,于是乎,把解决方法转移到了python,结果python确有实现办法,喜出望外的解决了这个需求。
  2. 现在有一个文件夹,里面是我存放的一批需要导入数据库的excel文件。python实现自动导入excel数据到MySQL中python实现自动导入excel数据到MySQL中
  3. 首先我需要获取这个文件夹所有文件的路径,存放到list中,再通过循环的方式读取文件,一个一个的把excel表数据插入到数据库当中。当然在插入过程中,如果数据不规范,可以按照需求进行了数据的清洗处理,我的excel中第一行都是中文汉字的列名,于是乎,我把列按照col_1,col_2,col_3......的形式进行重命名。
  4. 插入数据库用到python包sqlalchemy的create_engine模块,实现自动生成表,插入数据到MySQL中。
  5. 废话不多说,下面附上代码。
    # -*- coding: utf-8 -*-
    """
    Created on Mon Apr 20 14:18:49 2020
    
    @author: admin
    """
    import os
    import pandas as pd
    #import cx_Oracle as cx
    from sqlalchemy import create_engine
    import pymysql
    
    file_name=[]
    
    #获得文件的路径
    def get_file(file_dir):    
            for parent, dirnames, filenames in os.walk(file_dir):
                for filename in filenames:            
                    a = os.path.join(parent, filename)
                    file_name.append(a)
            #return file_name
            
    #调用函数
    get_file(r'C:\Users\admin\Desktop\tech\table')
    
    for i in file_name:
        df=pd.DataFrame(pd.read_excel(i))
        #转为字符串
        df1=df.astype(str)
        b = df.columns.size 
        #重命名列名
        col_name = []
        for j in range(b):
            a ='col_'+ str(j)
            col_name.append(a)
        #行数
        m = df.shape[0] 
        #列数
        n = df.shape[1]
    
        Matrix = [[0 for x in range(n)] for y in range(m)]   
        #去除单元格前后的空格
        for k in range(m):
            for j in range(n):
                Matrix[k][j]=df1.iloc[k][j].strip()
                
        df2 = pd.DataFrame(Matrix,columns=col_name)
        df2.columns = col_name
        df2 = df2.applymap(lambda x: x if str(x) != 'nan' else '')
        #截取表名
        table_name=i.split('\\')[-1].split('.')[0]
        #调用sqlalchemy包自动生成表插入数据
        try:
            engine=create_engine('mysql+pymysql://root:[email protected]:3336/test?charset=utf8',encoding='utf8')
            df2.to_sql(table_name,con=engine,if_exists='replace',index=False)
        except UnicodeEncodeError:
            print(table_name+'报错了')
        continue

    生成的表结构:如下所示:

    CREATE TABLE pub_newhigh_02_jc  ( 
    	XH              	bigint(20) NULL,
    	ENTNAME         	text NULL,
    	UNISCID         	text NULL,
    	ZCDZ            	text NULL,
    	QYFZR           	text NULL,
    	FZRDH           	text NULL,
    	RZID            	text NULL,
    	RDND            	bigint(20) NULL,
    	YYSRZE          	double NULL,
    	XSSR            	double NULL,
    	GXJSCPSR        	double NULL,
    	JCKZE           	double NULL,
    	YJKAJF          	double NULL,
    	LRZE            	double NULL,
    	JLR             	double NULL,
    	SJSJSF          	double NULL,
    	JNZZSE          	double NULL,
    	JNSDSE          	double NULL,
    	JMSZE           	double NULL,
    	CYRYSL          	bigint(20) NULL,
    	WJZJSL          	bigint(20) NULL,
    	DNZLSQSL        	bigint(20) NULL,
    	DNSQFMZLSL      	bigint(20) NULL,
    	QMYYYYZLSL      	bigint(20) NULL,
    	QMYYFMZLYXSL    	bigint(20) NULL,
    	QMYYRJZZQ       	bigint(20) NULL,
    	DNHDRJZZQ       	bigint(20) NULL,
    	QMJCDLSJZYQ     	bigint(20) NULL,
    	QZDNJCDLBTSJZYQ 	bigint(20) NULL,
    	QMZWXPZSL       	bigint(20) NULL,
    	QZDNZWXPZSL     	bigint(20) NULL,
    	QMGJXYSL        	bigint(20) NULL,
    	QZDNGJXYSL      	bigint(20) NULL,
    	QMGJYJZYBHPZSL  	bigint(20) NULL,
    	QZDNGJYJZYBHPZSL	bigint(20) NULL,
    	SSQY            	bigint(20) NULL,
    	GXJSLX          	text NULL,
    	YXQQ            	double NULL,
    	YXQZ            	double NULL,
    	BSC             	double NULL,
    	SSDS            	double NULL,
    	SFSCRD          	double NULL,
    	JFSJRQ          	double NULL,
    	ZJZ             	double NULL,
    	RCTDSL          	double NULL,
    	QMYYSYXXZLYXSL  	double NULL,
    	DNSQSYXZLSL     	double NULL,
    	QMYYWGZLYXSL    	double NULL,
    	DNSQWGZLSL      	double NULL,
    	QMGJJNZWPZSL    	double NULL,
    	QZDNGJJNZWPZSL  	double NULL,
    	QMYYQTZLYXSL    	double NULL,
    	DNSQQTZLSL      	double NULL,
    	YFTRBL          	double NULL,
    	YFTRZZL         	double NULL,
    	GNYFTRBL        	double NULL,
    	LRZZL           	double NULL,
    	ZSRZZL          	double NULL,
    	ZCFZL           	double NULL 
    	)