批量向mysql导入文件夹中的excl文件

本文介绍了一种使用Python程序批量将Excel文件夹中的多个表格数据导入到数据库特定表的方法。通过自定义函数实现数据库连接、读取Excel文件及数据转换,并执行SQL插入语句,大大提高了数据迁移效率。
部署运行你感兴趣的模型镜像

      因为需要批量的导入一批不包括表到数据库中,用手工太繁琐,所以写点程序批量导入,但是这个是单进程的,有想改进的小伙伴可以改成多进程的(可能快很多) 

import pymysql
from xlrd import xldate_as_tuple
import xlrd
from datetime import datetime
import os, time, random


'''
输入数据库的名字和数据表的名字,然后选择合适的文件夹,之后批量的把文件夹中的excl表中的数据导入到同一个数据表中。
这个需要提前做的工作是:1、提前在数据库中创建数据表,2、再插入的数据的到时候同样需要 填写 需要插入 字段的名字 和 字段的数据类型3、需要插入的文件夹的名字 4、数据库和数据表的名字
'''





def mysql_link(de_name):
    try:
        db = pymysql.connect(host="192.168.0.125", user="zhoujianhui",
                             passwd="root",
                             db='test',
                             charset='utf8')
        return db
    except:
        print("could not connect to mysql server")


'''
    读取excel函数
    args:excel_file(excel文件,目录在py文件同目录)
    returns:book
'''




'''
    执行插入操作
    args:db_name(数据库名称)
         table_name(表名称)
         excel_file(excel文件名,把文件与py文件放在同一目录下)

'''


def store_to(db_name, table_name, Folder_file_total):
    db = mysql_link(db_name)  # 打开数据库连接
    cursor = db.cursor()  # 使用 cursor() 方法创建一个游标对象 cursor

    for Folder_file in [a for a, b, c in os.walk(Folder_file_total, topdown=True)][1:]:



        excel_files = sorted(os.listdir(Folder_file),key=lambda x:int(x[:-5]))
        excel_files = [Folder_file + '\\' + i for i in excel_files]
        print(excel_files)

        for excel_file in excel_files:

            start = time.time()
            book = xlrd.open_workbook(excel_file)  # 打开excel文件
            sheets = book.sheet_names()  # 获取所有sheet表名

           
            sh = book.sheet_by_name(sheets[0])
            row_num = sh.nrows  # 获取行数
            print(excel_file)
            print(row_num)

            list = []  # 定义列表用来存放数据
            for i in range(1, row_num):  # 第一行是标题名,对应表中的字段名所以应该从第二行开始,计算机以0开始计数,所以值是1
                row_data = sh.row_values(i)  # 按行获取excel的值
                row_data[1] = datetime(*xldate_as_tuple(row_data[1], 0)).strftime(
                    '%Y/%m/%d')  # 将excl中提取的数字时间格式格式转化成正常的时间格式

                value = tuple(row_data)
                list.append(value)  # 将数据暂存在列表
                
           
            sql = "INSERT INTO " + table_name + "(设备ID,日期,地理城市,运营城市名,区县,网点ID,网点名,设备类型,首次激活时间, 排班值守, 主柜数, 副柜数, 箱格数, 大箱格数, 中箱格数, 小箱格数, 投件量_大箱, 投件量_中箱格, 投件量_小箱格, 取件量_付费取件, 投件量, 投件率_大箱, 投件率_中箱格, 投件率_小箱格, 投件率, 滞留件数量_96小时, 取件免费时长,取件基础费用, 取件基础费用时长, 取件超时续费单价, 取件超时续费周期, 取件费用封顶价格)VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
            print('准备导入...')
            cursor.executemany(sql, list)  # 执行sql语句
            db.commit()  # 提交
            list.clear()  # 清空list
            end = time.time()
            print("excl: " + excel_file + " has been inserted " + str(row_num) + " datas!")
            print("excl: " + excel_file + " has been costed %s s" % (end - start))
            print('There is a total %d has been imported  %d 个表,Completion degree %d%%' % (
                len(excel_files), (excel_files.index(excel_file) + 1),
                (excel_files.index(excel_file) + 1) * 100 / len(excel_files)))

    cursor.close()  # 关闭连接
    db.close()


if __name__ == '__main__':
    first = time.time()

    store_to('test','设备大表1_2018',r'C:\Users\lenovo\Desktop\设备大表3')

    last = time.time()

    print('这件事共用时 %f h'% round((last-first)/3600,2))

 

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 实现Kettle批量导入多个Excel文件MySQL 要使用 Kettle(现称为 **Pentaho Data Integration**)将多个 Excel 文件批量导入MySQL 数据库中,可以通过设计一个 **Transformation(转换)** 和 **Job(作业)** 来实现自动化处理。 #### 1. 环境准备 - **JRE 环境**:Kettle 需要 Java 运行环境,建议使用 Java 8 或更高版本[^1]。 - **MySQL JDBC 驱动**:Kettle 默认不包含 MySQL 的 JDBC 驱动,需手动下载 `mysql-connector-java-x.x.x.jar` 文件,并将其放入 Kettle 安装目录下的 `lib` 文件夹中,之后重启 Kettle 以加载驱动[^2]。 #### 2. 文件结构与数据准备 假设所有 Excel 文件位于一个指定目录中,且每个 Excel 文件的结构一致。例如,文件结构如下: ``` /data/excel/ ├── data1.xlsx ├── data2.xlsx └── data3.xlsx ``` 每个 Excel 文件包含以下字段: | name | age | role_name | |-------|-----|-----------| MySQL 表结构定义如下: ```sql CREATE TABLE user_info ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), age INT, role_code VARCHAR(50), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); ``` 其中: - `id`:主键,自动递增。 - `role_code`:需根据 `role_name` 查询角色表获取对应的角色代码。 - `created_at` 和 `updated_at`:为系统自动填充字段。 #### 3. Kettle 配置步骤 ##### (1) 创建 Transformation 1. **输入步骤**:使用 **Excel 输入** 步骤读取 Excel 文件数据。 2. **字段映射**:将 Excel 中的 `name`、`age`、`role_name` 映射到目标字段。 3. **角色代码查询**:使用 **数据库查询** 步骤,通过 `role_name` 查询角色表获取 `role_code`。 4. **常量字段设置**:使用 **计算器** 或 **JavaScript** 步骤设置 `created_at` 和 `updated_at` 字段的值。 5. **输出步骤**:使用 **表输出** 或 **插入/更新** 步骤将数据写入 MySQL 数据库表。 ##### (2) 创建 Job 1. **开始步骤**:启动作业。 2. **获取文件列表**:使用 **获取文件名** 步骤获取指定目录下的所有 Excel 文件路径。 3. **循环处理文件**:使用 **作业项** 调用前面创建的 Transformation,并将文件路径作为参数传递。 4. **结束步骤**:完成所有文件导入后结束作业。 #### 4. 示例 Transformation 配置说明 - **Excel 输入配置**: - 文件路径:`/data/excel/*.xlsx` - 工作表:选择需要导入的工作表。 - 字段映射:`name`, `age`, `role_name` - **数据库查询配置**: - SQL 查询:`SELECT role_code FROM role WHERE role_name = ?` - 参数映射:将 `role_name` 字段作为参数传入。 - **常量字段设置**: - 使用 JavaScript 步骤添加当前时间戳: ```javascript var now = new Date(); created_at = now.toISOString().slice(0, 19).replace('T', ' '); updated_at = created_at; ``` - **表输出配置**: - 表名:`user_info` - 字段映射:`name`, `age`, `role_code`, `created_at`, `updated_at` #### 5. 示例 Job 配置说明 - **获取文件名配置**: - 文件夹路径:`/data/excel/` - 文件名匹配:`*.xlsx` - 输出字段名:`filename` - **循环执行 Transformation**: - 调用 Transformation,并将 `filename` 作为参数传入。 --- ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值