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

时间:2016-02-12 10:16:03

标签: python sql database

我正在尝试从数据库中提取数据并将它们分配给不同的列表。 这个特定的错误给我带来了很多麻烦" 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

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

8 个答案:

答案 0 :(得分:21)

如错误所述,row是一个元组,因此您无法row["pool_number"]。您需要使用索引:row[0]

答案 1 :(得分:6)

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允许我使用列名作为索引来访问行。但可怜的复制粘贴消除了这种错误。

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

答案 2 :(得分:3)

问题是您如何访问row

具体为row["waocs"]的{​​{1}}和row["pool_number"]

如果您查找ocs[row["pool_number"]]=int(row["waocs"]) fetchall(),则会找到。

  

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

因此,您必须使用row[__integer__]

row[0]来访问行的值

答案 3 :(得分:1)

只需添加如下所示的参数即可。

cursor=conn.cursor(dictionary=True)

我希望这也会有所帮助。

答案 4 :(得分:1)

我知道这不是特定于这个问题,但对于任何从 Google 搜索进来的人来说:这个错误也是由创建元组而不是字典的对象后面的逗号引起的

>>>dict = {}
>>>tuple = {},

元组

>>>tuple_ = {'key' : 'value'},
>>>type(tuple_)
<class 'tuple'>

字典

>>>dict_ = {'key' : 'value'} 
>>>type(dict_)        
<class 'dict'>

答案 5 :(得分:0)

我认为您应该

for index, row in result: 

如果您想按名称访问。

答案 6 :(得分:0)

SQlite3 有一个名为 row_factory 的方法。此方法允许您按列名访问值。

https://www.kite.com/python/examples/3884/sqlite3-use-a-row-factory-to-access-values-by-column-name

答案 7 :(得分:0)

我看到您正在尝试通过行名称进行识别。如果要查找行中的特定列,可以执行 [integer][column name]

例如,要遍历每一行并且只从列标题为“pool number”的行中取出值,您可以这样做:

for row in df_updated.iterrows():
    cell = row[1]['pool number']
    print(cell)

然后代码将遍历每一行,但只打印出与“池编号”列匹配的值