You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用LOAD DATA LOCAL INFILE批量导入TXT到MySQL遇空行问题求助

排查Python用LOAD DATA导入TXT到MySQL的问题并修正

我帮你仔细捋了下代码里的问题,这几个地方导致了导入失败且生成空行:

  • 模块导入语法错误:你把三个import写在一行的写法不符合Python规范,会直接报错。正确的写法应该是每个import单独占一行:

    import MySQLdb
    import sys
    import os
    
  • 文件路径混乱:你遍历的目录是C:\Users\msalimi\Google Drive\s\Discharge_Summary,但拼接文件路径时却用了C:\Discharge_Summary,这会导致程序找不到文件;另外r'C:\Discharge_Summary\'+x的字符串拼接方式也有问题,r前缀的原始字符串和普通字符串拼接容易出转义错误,应该用os.path.join来正确拼接路径。

  • LOAD DATA语句缺少列映射:你的表有LastName列,自增ID会自动生成,但你没指定LOAD DATA要把文件内容插入到哪个列,MySQL不知道该把内容放到哪里,自然就生成了空行。另外,直接用%s格式化文件名有SQL注入风险,还会因为路径里的特殊字符出错。

  • 数据库连接重复创建/关闭:你在循环里每次都新建连接再关闭,不仅效率低,还可能导致连接泄漏,应该把连接放在循环外面。

  • 缺少异常处理:没加try-except的话,你根本看不到具体是哪里出错了,没法定位问题。

正确的实现代码

import MySQLdb
import os

# 统一根目录,和遍历的路径保持一致
root_dir = r"C:\Users\msalimi\Google Drive\s\Discharge_Summary"

try:
    # 建立数据库连接,必须开启local_infile才能用LOCAL INFILE
    db = MySQLdb.connect(
        host="localhost",
        user="root",
        passwd="Pass",
        db="myblog",
        local_infile=True
    )
    cursor = db.cursor()

    # 遍历目录下的所有TXT文件
    for filename in os.listdir(root_dir):
        if filename.lower().endswith(".txt"):
            file_path = os.path.join(root_dir, filename)
            # 指定插入到LastName列,同时处理文件换行符(根据你的实际文件调整)
            sql = """
                LOAD DATA LOCAL INFILE %s 
                INTO TABLE clamp_test 
                (LastName)
                LINES TERMINATED BY '\r\n'
            """
            # 用参数传递路径,避免SQL注入和转义问题
            cursor.execute(sql, (file_path,))
            print(f"已成功导入: {filename}")

    db.commit()
    print("所有文件导入完成!")

except Exception as e:
    # 出错时回滚事务
    if 'db' in locals():
        db.rollback()
    print(f"导入失败,错误信息: {str(e)}")
finally:
    # 确保关闭游标和连接
    if 'cursor' in locals():
        cursor.close()
    if 'db' in locals():
        db.close()

几个关键注意点

  • 连接数据库时必须加local_infile=True,否则MySQL会禁用LOCAL INFILE操作,这是很多人踩坑的核心点。
  • 只处理.txt文件,避免目录里的子目录、临时文件干扰导入。
  • 用参数化方式传递文件路径,比字符串格式化更安全,还能自动处理路径转义。
  • 指定(LastName)列,明确告诉MySQL把文件内容插入到这个字段,自增ID会自动生成。
  • 加上异常处理和事务回滚,一旦出错能保证数据不会乱,还能看到具体错误原因。

内容的提问来源于stack exchange,提问作者nina_dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:55:13