使用Python 2.7将CSV导入MySQL遇报错,求问题排查解决
解决Python导入CSV到MySQL时的执行报错问题
看起来你在把CSV导入MySQL的过程中踩了几个新手常见的坑,我来帮你逐个梳理并修正:
你的代码里的核心问题
- 文件打开方式错误:Python中打开文件应该用
open()函数,而非直接调用file(),而且推荐用with语句自动管理文件资源,避免遗漏关闭操作。 - SQL参数传递方式错误:你把SQL语句和参数打包成一个元组传给
cursor.execute(),但正确用法是把SQL语句作为第一个参数,参数列表作为第二个独立参数。另外,直接用%s/%d拼接字符串不仅有SQL注入风险,还会因CSV读取的全是字符串,硬转%d导致类型转换报错。 - 缺少事务提交:MySQL默认是手动提交事务的,若没执行
conn.commit(),数据不会真正写入数据库。
修正后的完整代码示例
import csv import mysql.connector # 替换成你的数据库连接信息 conn = mysql.connector.connect( host='你的主机地址', user='你的用户名', password='你的密码', database='你的数据库名' ) cursor = conn.cursor() # 用with语句安全打开CSV文件,指定合适编码避免乱码 with open('20184329:2143.csv', 'r', encoding='utf-8') as csv_file: file_reader = csv.reader(csv_file) # 若CSV有表头,执行这行跳过;没有就删除该行 next(file_reader) # 用%s作为参数占位符,MySQL会自动处理类型转换 sql_insert = """INSERT INTO STAGING(ADRESSE_1600 , ADRESSE_1601, ADRESSE_1602, ADRESSE_1603) VALUES (%s, %s, %s, %s)""" for row in file_reader: # 确保每行数据的字段数和表字段匹配,避免参数数量错误 if len(row) == 4: cursor.execute(sql_insert, row) # 提交事务,将数据写入数据库 conn.commit() # 关闭游标和连接,释放资源 cursor.close() conn.close()
额外注意事项
- 数据类型匹配:如果
ADRESSE_1601和ADRESSE_1602是整数类型,CSV对应的列必须是合法数字字符串,否则插入会报错。遇到非数字情况,要先做数据清洗(比如判断是否可转int、处理空值)。 - 批量插入优化:若CSV数据量很大,推荐用
cursor.executemany(sql_insert, rows_list)批量插入,比逐行插入效率高很多。
内容的提问来源于stack exchange,提问作者totoro




