【python】pandas+SQLAlchemy 读取excel并向mysql中插入数据

1、简介

SQLAlchemy是Python SQL工具包和对象关系映射器,它为应用程序开发人员提供了SQL的全部功能和灵活性。SQLAlchemy提供了一整套著名的企业级持久性模式,旨在实现高效和高性能的数据库访问,并改编为一种简单的python域语言。

pandas: 功能强大的Python数据分析工具包
pandas是一个Python包,它提供了快速、灵活和富有表现力的数据结构,旨在使处理“关系”或“标记”数据既简单又直观。它旨在成为用Python进行实际的、真实世界的数据分析的基本高级构建块。此外,它的更大目标是成为任何语言中可用的最强大和最灵活的开源数据分析/操作工具。它已经在朝着这一目标前进。

2、安装

pip install SQLalchemy
pip install pandas

SQLalchemy github
pandas github

3、SQLAlchemy使用

3.1、 概念介绍

概念 对应数据库 说明
Engine 连接 驱动引擎
Session 连接池,事务 由此开始查询
Model 类定义
Column
Query 若干行 可以链式添加多个条件

常见数据类型

数据类型 SQL数据类型 python数据类型 说明
Integer int int 整形,32位
String varchar string 字符串
Text text string 长字符串
Float float float 浮点型
Boolean tinyint bool True / False
Date date datetime.date 时间年月日
Date Time datetime datetime.datetime 年月日时分秒毫秒等
Time time datetime.datetime 时分秒

3.2、链接mysql

链接mysql,并创建数据库(有的业务数据库需要动态创建,可以用这种方法),注意.connect()的时候才是正式链接上mysql

connection = create_engine("mysql+pymysql://{0}:{1}@{2}/".format(
                user, password, host
            ), isolation_level='AUTOCOMMIT', encoding='utf-8').connect()
connection.execute('CREATE DATABASE IF NOT EXISTS {};'.format(database))
connection.execute('USE {};'.format(database))

链接mysql中的指定database,这种使用方式是database已存在的使用用,不然会报错找不到database

engine =  create_engine("mysql+pymysql://{0}:{1}@{2}/{3}".format(
                user, password, host, database
            ), isolation_level='AUTOCOMMIT', encoding='utf-8')
            

4、pandas使用

4.1、读取excel的数据

读取excel

import pandas as pd
data = pd.ExcelFile(file)

读取指定sheet中的某行列的内容
example:读取第1个sheet中的第二行第一列的值

    
    sheet1 = pd.read_excel(data,sheetname=0)
    data1 = sheet1.iloc[2][1]

遍历每个sheet,挑选表头中包含‘ID’的sheet,满足条件的sheet下遍获取指定列’ID’的数据

    sheet_names=data.sheet_names
    for sheet in sheet_names:
        df=pd.read_excel(data,sheetname=sheet)
        if len(df)<1 or 'ID' not in df.head().keys():
            continue
            ID = df['ID'].values[i]
            Name = df['Name'].values[i]
            write_csv(csv_path, {'ID':ID,'Name':Name})

写csv
filename为 csv文件, mode为a 表示追加, index为写入行名称(索引),header为每次追加是否把标题追加进去
columns:代表设置csv的表头有哪几列

    try:
        df = pd.DataFrame(data,columns= ['ID','Name'],index=[0])  
        if not os.path.exists(csv_path):
            df.to_csv(csv_path, header=True, index=False, mode='a')
        else:
            df.to_csv(csv_path, header=False, index=False, mode='a')
    except Exception as e :
        print(f"write csv failed:{e}")

4.2、读取csv数据插入mysql

比一条一条数据插入mysql性能更好

    try:
        df = pd.read_csv(csv_path, names= ['ID','Name'], header=0)
        df["Date"] = time.strftime("%Y-%m-%d %H:%M:%S")
        df.to_sql(table_name,  con=engine, if_exists='append', index=False)
        print("csv insert into sql success!")
    except Exception as e :
        print(f"csv insert into sql failed : {e}") 

五、完整代码:

import pandas as pd
import os,sys
from sqlalchemy import create_engine

engine = None
#链接数据库
def mysql_conn(user, password, host,database):
    try:
        with create_engine("mysql+pymysql://{0}:{1}@{2}/".format(
                user, password, host
            ), isolation_level='AUTOCOMMIT', encoding='utf-8').connect() as connection:
            connection.execute('CREATE DATABASE IF NOT EXISTS {};'.format(database))
            connection.execute('USE {};'.format(database))
            engine =  create_engine("mysql+pymysql://{0}:{1}@{2}/{3}".format(
                user, password, host, database
            ), isolation_level='AUTOCOMMIT', encoding='utf-8')
    except Exception as e :
        print(f"mysql connect failed :{e}")  
    return engine
    
#读取excel,写csv
def read_csv(file, csv_path):
    data = pd.ExcelFile(file)
    sheet_names=data.sheet_names
    sheet1 = pd.read_excel(data,sheetname=0)
    data1 = sheet1.iloc[2][1]
    
    for sheet in sheet_names:
        df=pd.read_excel(data,sheetname=sheet)
        if len(df)<1 or 'ID' not in df.head().keys():
            continue
        for i in range(len(df)):
            if  not isinstance(df['ID'].values[i], str) or df['ID'].values[i] == "Case ID":
                continue
            ID = df['ID'].values[i]
            Name = df['Name'].values[i]
            write_csv(csv_path, {'ID':ID,'Name':Name})
            
def write_csv(csv_path, data):
    try:
        df = pd.DataFrame(data,columns=['ID','Name'],index=[0])  
        # filename为 csv文件, mode为a 表示追加, index为写入行名称(索引),header为每次追加是否把标题追加进去
        if not os.path.exists(csv_path):
            df.to_csv(csv_path, header=True, index=False, mode='a')
        else:
            df.to_csv(csv_path, header=False, index=False, mode='a')
    except Exception as e :
        print(f"write csv failed:{e}")
        
#把csv数据插入数据库,这里使用的engine为mysql_conn方法返回的对象        
def insert_into_sql(csv_path, engine, table_name): 
    try:
        df = pd.read_csv(csv_path, names= ['ID','Name'], header=0)
        df["Date"] = time.strftime("%Y-%m-%d %H:%M:%S")
        df.to_sql(table_name,  con=engine, if_exists='append', index=False)
        print("csv insert into sql success!")
    except Exception as e :
        print(f"csv insert into sql failed : {e}")    
if __name__ == '__main__':
    #execute example
    engine = mysql_conn('XXXX', '1234',  '3306', 'testdatabase')
    read_csv('E:\test\data.xlsx','test.csv')
    insert_into_sql('test.csv',engine, tablename)
    

你可能感兴趣的:(#,python,pandas,python,excel,SQLAlchemy,mysql)