问题 TypeError:元组索引必须是整数,而不是str


我试图从数据库中提取数据并将它们分配给不同的列表。 这个特定的错误给了我很多麻烦“TypeError:元组索引必须是整数,而不是str” 我尝试将它转换为浮动等等,但没有成功。

代码如下

conn=MySQLdb.connect(*details*)
cursor=conn.cursor()
ocs={}
oltv={}
query="select pool_number, average_credit_score as waocs, average_original_ltv as waoltv from *tablename* where as_of_date= *date*"
cursor.execute(query)
result=cursor.fetchall()

for row in result:
 print row
 ocs[row["pool_number"]]=int(row["waocs"])
 oltv[row["pool_number"]]=int(row["waoltv"])

print语句的示例输出如下:

('MA3146', 711L, 81L)
('MA3147', 679L, 83L)
('MA3148', 668L, 86L)

这是我得到的确切错误:

ocs[row["pool_number"]]=int(row["waocs"])
TypeError: tuple indices must be integers, not str

任何帮助,将不胜感激 !谢谢大家!


12107
2018-02-12 10:16


起源



答案:


就像错误说的那样, row 是一个元组,所以你做不到 row["pool_number"]。您需要使用索引: row[0]


9
2018-02-12 10:20





问题是你如何访问 row 

特别 row["waocs"] 和 row["pool_number"] 的 ocs[row["pool_number"]]=int(row["waocs"])

如果你抬头看 官方的文档 的 fetchall() 你发现。

该方法获取查询结果集的所有(或所有剩余)行,并返回元组列表。

因此,您必须使用访问行的值 row[__integer__] 喜欢 row[0]


1
2018-02-12 10:21





TL; DR:添加参数 cursorclass=MySQLdb.cursors.DictCursor 在你的结尾 MySQLdb.connect


我有一个工作代码,数据库移动了,我不得不改变主机/用户/通行证。在此更改后,我的代码停止工作,我开始收到此错误。仔细检查后,我将连接字符串复制粘贴到具有额外指令的位置。旧代码如下:

 conn = MySQLdb.connect(host="oldhost",
                        user="olduser",
                        passwd="oldpass",
                        db="olddb", 
                        cursorclass=MySQLdb.cursors.DictCursor)

其中被替换为:

 conn = MySQLdb.connect(host="newhost",
                        user="newuser",
                        passwd="newpass",
                        db="newdb")

参数 cursorclass=MySQLdb.cursors.DictCursor 最后让python允许我使用列名作为索引来访问行。但可怜的复制粘贴消除了这一点,产生了错误。

因此,作为已经提供的解决方案的替代方案,您还可以添加此参数并以您最初想要的方式访问行。 ^ _ ^我希望这有助于其他人。


1
2018-05-07 23:48