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

我试图从数据库中提取数据,并将它们分配到不同的列表中。 这个特定的错误给我带来了很多麻烦“ TypeError: tuple 索引必须是整数,而不是 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"])

打印报表的输出样本如下:

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

我得到的正是这个错误:

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

任何帮助都会很感激! 谢谢大家!

258012 次浏览

正如错误所说,row是一个元组,所以不能执行 row["pool_number"]。您需要使用索引: row[0]

问题是如何访问 row

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

如果你查 fetchall()官方文件,你会发现。

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

因此,您必须使用 row[__integer__](如 row[0])访问行的值

DR: 在 MySQLdb.connect的末尾添加参数 cursorclass=MySQLdb.cursors.DictCursor


我有一个工作代码和数据库移动,我必须改变主机/用户/通行证。这个更改之后,我的代码停止工作,我开始得到这个错误。经过仔细检查,我将连接字符串复制粘贴到有额外指令的位置。原来的代码是这样的:

 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 允许我使用列名作为索引访问行。但是糟糕的复制粘贴消除了这一点,产生了错误。

因此,作为已经提供的解决方案的替代方案,您还可以添加这个参数,并按照最初希望的方式访问行。我希望这能帮助别人。

我觉得你应该这么做

for index, row in result:

如果你想通过名字访问。

只是添加一个像下面这样的参数就可以了。

cursor=conn.cursor(dictionary=True)

我希望这个也能帮上忙。

SQlite3有一个名为 row _ Factory 的方法,该方法允许您通过列名访问这些值。

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

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

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

Tuple

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

字典

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

我知道你想通过一行的名字来识别。如果要在行中查找特定的列,可以执行[ int ][ column name ]

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

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

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