初学Python - 需要帮助遍历MySQL数据库中的一列并将值存储在列表中

1 投票
2 回答
1531 浏览
提问于 2025-04-18 01:03

下面的Python代码是用来连接我的数据库的。我想做的是遍历一个包含整数值的列,把这些值都放到一个列表里。我需要这个列表里的值,因为我想把它们标准化到0到1的范围内。

import MySQLdb
import sys

db = MySQLdb.connect(host="****", user="****", passwd="****", db="****", port=3306)
cursor = db.cursor()
cursor.execute("SELECT columnName FROM TABLE5")

col1 = []
numrows = int(cursor.rowcount)
for x in range(0,numrows):
    row = cursor.fetchall()
    col1.append(row[x])
    print col1

cursor.close()
db.close()
sys.exit()  

目前上面的代码输出的是:

[('67',)]
Traceback (most recent call last):
 File "miner.py", line 12, in <module>
  col1.append(row[x])
IndexError: tuple index out of range

如果有人能帮忙就太好了!

2 个回答

0

我觉得你对 cursor.fetchall() 的用法有点混淆。我猜你以为它会返回单行的所有列。但实际上,它是返回你执行的查询中的 所有行

所以,你只需要在循环外执行一次 cursor.fetchall()

另外,虽然你的循环(或者说,类似的东西)可以工作,但它有点复杂,不太符合 Python 的风格。这是因为 fetchall() 的结果(所有行的列表)可以直接遍历,而不需要担心行数。每次遍历会产生一个单独的行对象,里面包含你想要的列。所以:

col1 = []
all_the_rows = cursor.fetchall()
for row in all_the_rows:
    # We want the first-and-only column value in the row
    col1.append(row[0])

 # Wait until we have all the values to print them.
print col1

你可以进一步简化这个(Joran 在上面有个例子),但最好先从一个普通的 for 循环开始,等你掌握了再去学习更高级的概念。

1
cursor.execute("SELECT columnName FROM TABLE5")
col_names = [row[0] for row in cursor.fetchall()]

这可能就是你想要的,cursor.fechall() 会返回类似这样的东西:

[("ColName1",),("Colname2",),...]

所以我们只需要遍历那个列表,从每个元组中取出第一个项目。

你也可以做一些花哨的操作,比如:

col_names = list(itertools.chain.from_iterable(cursor.fetchall()))

但其实简单的列表推导就已经足够用了。

撰写回答