【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数据类型说明
Integerintint整形,32位
Stringvarcharstring字符串
Texttextstring长字符串
Floatfloatfloat浮点型
BooleantinyintboolTrue / False
Datedatedatetime.date时间年月日
Date Timedatetimedatetime.datetime年月日时分秒毫秒等
Timetimedatetime.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)
    

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值