初学Python - 需要帮助遍历MySQL数据库中的一列并将值存储在列表中
下面的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()))
但其实简单的列表推导就已经足够用了。