python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python批量导入CSV到MySQL

Python批量导入CSV到MySQL的完整步骤

作者:小小的木头人

本文分享一个Python自动导入方案,能自动扫描目录、根据文件名匹配表名、自动检测文件编码(GBK/UTF-8等),并利用pandas分批读取避免内存溢出,同时显示进度条让你实时掌握导入进度,适合运维、数据迁移等场景,帮你高效完成批量数据导入,需要的朋友可以参考下

下面给你整理成一篇 适合技术博客发布的版本(结构清晰、运维/数据工程风格)。内容包括背景、思路、代码、优化点等。

Python 批量导入 CSV 到 MySQL(自动识别编码 + 进度条)

在实际工作中,经常会遇到这样的需求:

deps_01.csv
deps_02.csv
deps_03.csv

需要把这些 CSV 批量导入到 MySQL 指定表中。

并且存在几个实际问题:

  1. CSV 文件数量多
  2. 文件可能比较大
  3. 编码可能不统一(GBK / GB2312 / UTF-8 等)
  4. 希望看到 导入进度

本文提供一套 Python 自动导入方案。

实现功能:

一、环境准备

安装 Python 依赖:

pip install pandas sqlalchemy pymysql tqdm chardet

依赖说明:

库作用
pandas读取 CSV
sqlalchemy数据库连接
pymysqlMySQL 驱动
tqdm进度条
chardet检测文件编码

二、目录结构示例

例如 CSV 文件目录:

D:\test
deps_01.csv
deps_02.csv
deps_03.csv
user_01.csv
user_02.csv

如果配置:

TABLE_LIST = ["user"]

则:

user_01.csv
user_02.csv

会导入到 user 表。

三、完整 Python 脚本

import os
import pandas as pd
from sqlalchemy import create_engine
from tqdm import tqdm
import chardet

# ===============================
# MySQL 配置
# ===============================
MYSQL_USER = "root"
MYSQL_PASS = "123456"
MYSQL_HOST = "127.0.0.1"
MYSQL_PORT = 3306
MYSQL_DB = "testdb"

# ===============================
# CSV 目录
# ===============================
CSV_DIR = r"D:\test"

# ===============================
# 需要导入的表
# ===============================
TABLE_LIST = [
    "user"
]

# ===============================
# 每批导入行数
# ===============================
CHUNK_SIZE = 5000

# ===============================
# 创建数据库连接
# ===============================
engine = create_engine(
    f"mysql+pymysql://{MYSQL_USER}:{MYSQL_PASS}@{MYSQL_HOST}:{MYSQL_PORT}/{MYSQL_DB}?charset=utf8mb4"
)

# ===============================
# 自动识别编码
# ===============================
def detect_encoding(file_path):
    with open(file_path, "rb") as f:
        data = f.read(100000)   # 只读取前100KB
        result = chardet.detect(data)
        return result["encoding"]

print("程序启动,扫描目录:", CSV_DIR)

# ===============================
# 扫描CSV文件
# ===============================
for file in os.listdir(CSV_DIR):

    if not file.endswith(".csv"):
        continue

    # 根据文件名匹配表名
    matched_table = None
    for table in TABLE_LIST:
        if table in file:
            matched_table = table
            break

    if not matched_table:
        continue

    filepath = os.path.join(CSV_DIR, file)

    print(f"\n准备导入 {file} -> 表 {matched_table}")

    try:

        encoding = detect_encoding(filepath)
        print("检测到编码:", encoding)

        reader = pd.read_csv(
            filepath,
            encoding=encoding,
            chunksize=CHUNK_SIZE,
            low_memory=False
        )

        for chunk in tqdm(reader, desc=file):

            chunk.to_sql(
                name=matched_table,
                con=engine,
                if_exists="append",
                index=False
            )

        print(f"{file} 导入完成")

    except Exception as e:

        print(f"{file} 导入失败:", e)

print("\n所有任务完成")

四、运行脚本

执行:

python import_csv_to_mysql.py

运行效果:

程序启动,扫描目录: D:\test

准备导入 user_01.csv -> 表 user
检测到编码: GB18030
user_01.csv: 120it [00:20,  5.8it/s]

user_01.csv 导入完成

其中:

120it

表示 处理了 120 个批次。

如果:

CHUNK_SIZE = 5000

则:

120 × 5000 ≈ 60万行数据

五、关键实现思路

1 自动检测 CSV 编码

很多 CSV 来自:

编码可能是:

UTF8
GBK
GB2312
GB18030

使用:

chardet.detect()

自动识别。

2 分批导入避免内存溢出

使用:

chunksize = 5000

pandas 会 每次读取 5000 行。

好处:

3 进度条显示

使用:

from tqdm import tqdm

示例:

deps_01.csv: 62it [01:46, 1.56s/it]

含义:

字段含义
62it处理 62 个批次
1.56s/it每个批次约 1.56 秒

4 文件名自动匹配表

代码逻辑:

文件名包含表名 → 导入该表

例如:

文件名导入表
user_01.csvuser
user_02.csvuser

六、性能优化建议

如果数据量很大(千万级),建议:

1 增大批量

CHUNK_SIZE = 10000

或

CHUNK_SIZE = 20000

2 关闭 MySQL 索引

导入前:

ALTER TABLE user DISABLE KEYS;

导入后:

ALTER TABLE user ENABLE KEYS;

3 使用 LOAD DATA(最快)

如果 CSV 非常大,可以使用:

LOAD DATA INFILE

性能比 pandas 快 10~50倍。

七、适用场景

该脚本适用于:

八、总结

本文实现了一套 自动化 CSV 导入 MySQL 工具,特点:

适合处理 大量 CSV 文件导入数据库 的场景。

到此这篇关于Python批量导入CSV到MySQL的完整步骤的文章就介绍到这了,更多相关Python批量导入CSV到MySQL内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文