无需手动录入向MySQL导入Excel数据?Python代码报错求解
问题解决:CSV导入MySQL报错及免手动录入方案
1 报错not enough arguments for format string根因
- 直接遍历pandas DataFrame对象时,默认返回的是列名而非每行数据,你传入
cursor.execute的参数实际是单个列名字符串,无法匹配SQL语句里的9个%s占位符,因此触发参数不足的报错 - 额外冗余问题:你在循环内反复创建、关闭数据库连接,会大幅降低导入效率,也容易出现连接异常
2 原有代码修复方案
修正遍历逻辑,把连接操作移到循环外即可正常运行,修复后代码如下:
import os import pandas as pd import pymysql if os.path.isfile('Desafio.csv'): try: csv = pd.read_csv("Desafio.csv", skiprows = range(0, 14)) # 数据库连接移到循环外,只创建一次 con = pymysql.connect(db='new_schema', user='root', passwd='password123H.') cursor = con.cursor() query = "INSERT INTO afastamentos(codigo,custo,identificacao,funcionario,cargo,data_do_afastamento,especialidade,motivo,funcionario_lider) VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s);" # 用iterrows遍历每行数据 for _, row in csv.iterrows(): # 把行数据转成元组传入执行 cursor.execute(query, tuple(row)) con.commit() print('Dados inseridos com sucesso!') cursor.close() con.close() except Exception as erro: print('Erro!', erro)
3 免手动写插入语句的高效方案
无需手动写INSERT语句、逐行赋值,直接用pandas自带的to_sql方法即可一键导入全量数据,代码更简洁,导入效率更高:
import os import pandas as pd from sqlalchemy import create_engine if os.path.isfile('Desafio.csv'): try: # 读取CSV csv = pd.read_csv("Desafio.csv", skiprows = range(0, 14)) # 创建数据库引擎,按实际配置调整账号密码、地址、库名即可 engine = create_engine('mysql+pymysql://root:password123H.@localhost/new_schema') # 直接写入数据库,name为目标表名,if_exists='append'表示在原有表基础上追加数据,不写入索引列 csv.to_sql(name='afastamentos', con=engine, if_exists='append', index=False) print('数据导入成功!') except Exception as erro: print('导入出错:', erro)
注意:使用该方案需要确保CSV的列顺序和数据库表的字段顺序一一对应,或者CSV的列名和数据库表字段名完全一致,即可自动匹配写入,不需要手动录入任何字段值。
内容的提问来源于stack exchange,提问作者Guilherme
相关产品推荐
相关产品推荐

