我正在尝试从数据库中提取数据并将它们分配给不同的列表。 这个特定的错误给我带来了很多麻烦" 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
任何帮助将不胜感激!谢谢大家!
答案 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)
然后代码将遍历每一行,但只打印出与“池编号”列匹配的值