python for loop元组索引超出范围

时间:2013-01-03 15:24:51

标签: python

我仍然想要抓住蟒蛇的角色,所以请耐心等待。请。我有一些我在书中使用的代码。这本书没有正确显示代码中的空白区域,所以间距是我最好的猜测。此代码应该将MySQL查询的结果分解为更易读的格式。

if form is True:
columns_query = """DESCRIBE %s""" % (table)
print columns_query
columns_command = cursor.execute(columns_query)
headers = cursor.fetchall()
column_list = []
for record in headers:
    column_list.append(record[0])
output=""
for record in results:
    output = output + "===================================\n\n"
for field_no in xrange(0, len(column_list)):
    output = output + column_list[field_no] + ": " + str(record[field_no]) + "\n"
output = output + "\n"

当我尝试运行它时,我得到以下内容:

Traceback (most recent call last):
  File "odata_search.py", line 46, in <module>
    output = output + column_list[field_no] + ": " + str(record[field_no]) + "\n"
IndexError: tuple index out of range

它与代码的str(record[field_no])部分有关,但这就是本书中的样子,所以我不确定还有什么可以尝试。

2 个答案:

答案 0 :(得分:1)

显然len(record) != len(column_list)。 (具体而言,column_list 更长而不是record)。是否有理由认为它们的长度相同?

一个“修复”类似于:

for col,rec in zip(column_list,record):
    output += col + ": " + str(rec) + "\n"

而不是:

for field_no in xrange(0, len(column_list)):
    output = output + column_list[field_no] + ": " + str(record[field_no]) + "\n"

这会在column_listrecord的较短时间内截断输出。

我建议在任何情况下都使用zip代替range(0,len(...))。这更具惯用性。

答案 1 :(得分:0)

它的问题是白色空间,更重要的是MySQL查询本身。我正在拉一个列中的行而不是拉行的所有列,这是循环写入连接的。我将在错误查询的结果中返回的记录数不等于包含所有列的列表中的结果数。代码也打算成为循环中的循环,因此我在顶部的间距是错误的。它看起来应该如下所示。我在它之前添加了几行来显示我必须修改的查询:

旧陈述如下:

statement = """select %s from %s where %s like '%s' limit 10""" % (column, table, column, term)

应该是这样的:

statement = """select * from %s where %s like '%s' limit 10""" % (table, column, term)

command = cursor.execute(statement)
results = cursor.fetchall()

column_list = []
for record in results:
    column_list.append(record[0])

循环循环:

if form is True:
columns_query = """DESCRIBE %s""" % (table)
columns_command = cursor.execute(columns_query)
headers = cursor.fetchall()
column_list = []
for record in headers:
    column_list.append(record[0])
output=""
for record in results:
    output = output + "===================================\n\n"
    for field_no in xrange(0, len(column_list)):
        output = output + column_list[field_no] + ": " + str(record[field_no]) + "\n"
    output = output + "\n"