如何解决Pandas导入CSV到MySQL报AttributeError无Password属性错误
报错根因
你遇到的AttributeError核心原因是DataFrame列名Password-hashed包含横杠,使用itertuples()遍历行时,Python会把row.Password-hashed解析为减法运算(row.Password减去hashed变量),而非访问Password-hashed列,因此抛出找不到Password属性的错误。
除此之外你的代码还有3处语法错误会导致后续运行失败:
- SQL插入语句中列名误用单引号包裹,MySQL中单引号代表字符串字面量,列名需要用反引号(`)包裹或者不包裹
- mysql-connector的参数占位符是
%s而非?,同时11个插入列需要对应11个占位符,原代码只写了3个占位符,参数数量不匹配 itertuples()默认会把索引作为第一个返回值,直接按属性取会导致参数错位
修复步骤
- 先把带特殊符号的列名重命名,或者用
getattr()方法取值,推荐直接重命名避免后续访问问题 - 修正SQL语句的列名包裹符和占位符
- 调整参数传递方式,避免itertuples的索引干扰
- 优化提交逻辑,批量提交减少IO开销
修复后完整代码
import mysql.connector import pandas as pd # 读取CSV并重命名带横杠的列,避免属性访问错误 data = pd.read_csv('OnePassTesters.csv') df = pd.DataFrame(data, columns=[ 'Login', 'Name', 'Email', 'Mobile', 'Residence', 'Password-hashed', 'CPF', 'HDB', 'TP', 'DBS', 'FairPrice']) # 重命名带特殊符号的列 df = df.rename(columns={"Password-hashed": "Password_hashed"}) print(df) db = mysql.connector.connect( host="localhost", user="root", password="1234", database="OnePass" ) cursor = db.cursor() # 修正SQL语句:列名用反引号,占位符用%s,数量和列数匹配 insert_sql = ''' INSERT INTO OnePass.user_info (`Login_ID`,`User_Name`,`User_Email`,`User_Mobile`,`User_Residence`, `User_Password`, `CPF`,`HDB`,`TP`,`DBS`,`FairPrice`) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s) ''' # 批量插入效率更高,跳过索引避免参数错位 for row in df.itertuples(index=False): cursor.execute(insert_sql, (row.Login, row.Name, row.Email, row.Mobile, row.Residence, row.Password_hashed, row.CPF, row.HDB, row.TP, row.DBS, row.FairPrice) ) # 批量提交,不用每次循环提交 db.commit() cursor.close() db.close()
可选简化方案
如果不想重命名列,可以用getattr()直接取值,把取密码的部分换成getattr(row, 'Password-hashed')即可,不需要修改列名。
内容的提问来源于stack exchange,提问作者Kay Kham
相关产品推荐
相关产品推荐

