使用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
相关产品推荐
相关产品推荐

