int对象是不可迭代的?

问题描述:

该程序会迭代,但只有一直到某一行代码。然后它开始读取启动和停止变量,如7和9???!我不明白这里有什么问题。更奇怪的是,它跳到7,9到48,51(开始,停止值)。 下面的代码的主要部分:http://pastebin.com/S0FZ3Jk7 ,这里是我使用的是它的数据:http://pastebin.com/rchNJGBqint对象是不可迭代的?

""" 
Qualifiers_2.py 

""" 

#from Qualifier_classes import Qualifier 

file_path = 'C:\\Users\\Neo\\My Documents\\Python Scripts\\FTC Scouting\\sample.txt' 
file = open(file_path, 'r') 

Data = [] 
all_teams = [] 
Teams_list = [] 
keys = ['Team Number: ', 'Name: ','Qualifier: '] 
qualifier_keys = ['Qualifier: ', 'QP: ', 'RP: ', 'HS: ', 'Matches: '] 
team_attr = ['name','number'] 
UI_options = [1,2] 

class Qualifier(object): 
    def __init__(self): 
     self.name   = 'Qualifier Name' 
     self.rp    = 0 
     self.qp    = 0 
     self.hs    = 0 
     self.num_of_matches = 0 
     self.data = [self.name,self.rp,self.qp,self.hs,self.num_of_matches] 
    def __repr__(self): 
     self.data = [self.name,self.rp,self.qp,self.hs,self.num_of_matches] 
     return repr((self.data)) 

class Team:  
    def __init__(self,name,number): 
     self.name = name 
     self.number = number 

    def __repr__(self): 
     return repr((self.name,self.number))  

def list_teams(n): 
    tTeams = [] 
    for line in Data: 
     check = line.find(keys[n]) 
     if not check == -1: 
      team = line.partition(keys[n])[2] 
      if team not in tTeams: 
       tTeams.append(team) 
    return tTeams 

#@param: team_number , team to find 
#@output: gives back line number in raw Data list 
def find_start_team(team_number): 
    tcount = 0 

    if str(team_number) in list_teams(0): 
     for line in Data: 
      if not line.find(str(team_number)) == -1: 
       return tcount 
      else: 
       tcount += 1 
    else: 
     return 'not a valid team number' 

#@param: Start_team_number , the previous team next number 
#@output: the line number for the start and end of the team's acquired info 
def find_team(start_team_number): 
    try:   
     start_search = find_start_team(start_team_number) 
     tcount = start_search 
     for line in Data[start_search+1:]: 
      if not line.find(keys[0]) == -1: 
       return start_search, tcount 
      else: 
       tcount += 1 
    except ValueError: 
     return 'not a team number' 

def team_data(start,stop): 
    temp_data = [] 
    for line in Data[start:stop]: 
     temp_data.append(line) 
    return temp_data 

#@param: qualifier_key , the name of the category you wish to find 
#@param: data , the qualifier info for some team 
#@output: returns back the data for the category 
def get_data(qualifier_key, data): 
    for line in data: 
     if not line.find(qualifier_key) == -1: 
      return line.partition(qualifier_key)[2] 

#@param: data , the qualifier data for some team 
#@output: remaining_data , the remaining data after the first qualifier 
#    note: will return -1 if there is no more qualifiers 
def just_qualifiers(data): 
    tcount = 0 
    for line in data: 
     if not line.find(qualifier_keys[0]) == -1: 
      return data[tcount:] 
     tcount += 1 
    return -1 

#@param: data , array of values for a single qualifier 
def update_qualifier(data): 
    tqual = Qualifier() 
    tqual.name = data[0] 
    tqual.rp = data[1] 
    tqual.hs = data[2] 
    tqual.num_of_matches = tdata[3] 
    return tqual 

#@param: data , the block of data for the team 
#@output: the qualifier data and remainind data 
def get_qualifier(data): 
    temp_data = [] 
    for key in range(len(qualifier_keys)): 
     temp_data.append(get_data(qualifier_keys[key],data)) 
    temp_qual = update_qualifier(temp_data) 
    data = data[len(temp_data):] 
    return temp_qual, data 

#Turns our txt file into usable data 
for line in file: 
    line = line[:-1] 
    Data.append(line) 

#Creates a tuple for holding the ID of all the teams 
all_teams.append(list_teams(0)) 
all_teams.append(list_teams(1)) 

#Makes an organized list of the ID for all the teams in a 2-tuple 
for team in range(len(list_teams(0))): 
    Teams_list.append(Team(all_teams[1][team],int(all_teams[0][team]))) 

"""******************* 
NEW CODE 
*******************""" 

Qualifiers = [] 

for team in range(len(all_teams[0])): 
    start , stop = find_team((all_teams[0][team])) 

    tdata = [] 
    tqual = [] 


    #maps the specific teams block of data to tdata 
    for line in team_data(start, stop): 
     tdata.append(line) 
    tdata = just_qualifiers(tdata) 
    while True: 
     if not just_qualifiers(tdata) == -1: 
      tqual , tdata = get_qualifier(tdata) 
      Qualifiers.append(tqual)   
     else: 
      break  

print Qualifiers 

"""******************* 
END NEW CODE 
*******************""" 

file.close() 

和我回溯:

Traceback (most recent call last): 
    File "C:/Users/Neo/Documents/Python Scripts/FTC Scouting/Qualifiers_3.py", line 152, in <module> 
    if not just_qualifiers(tdata) == -1: 
    File "C:/Users/Neo/Documents/Python Scripts/FTC Scouting/Qualifiers_3.py", line 96, in just_qualifiers 
    for line in data: 
TypeError: 'int' object is not iterable 
+1

在您的问题中包含嵌入测试数据的代码,这样就可以触发错误,而无需保存文件并在代码中设置路径。 – agf 2012-04-09 01:41:27

+3

你是否试图将这个问题简化为一个仍然存在错误的小例子? – gbulmer 2012-04-09 01:54:22

+0

Seconding agf的评论。如果你不让他们为了看问题而做额外的工作,这里的人更有可能提供帮助。 – octern 2012-04-09 02:25:55

我不打算检讨整个程序摸不着头脑,但我没赶上一件事一目了然,为你追踪的一部分:

def update_qualifier(data): 
    tqual = Qualifier() 
    tqual.name = data[0] 
    tqual.rp = data[1] 
    tqual.hs = data[2] 
    tqual.num_of_matches = tdata[3] 
    return tqual 

您的意思是和借鉴e全球变量tdata[3]这里,而不是你的本地data

+0

感谢,并对此抱歉:(我是新来使用* – UnderWulf 2012-04-09 03:57:18

+0

@UnderWulf:可以理解随着本网站的问题数量,那些具有较高声誉的人已经看到了这种情况数量可观的时间,它最终几乎是机械如果你的问题简单直接,你会得到最好的答案,SO上的人对于大型脚本的代码评审是非常不利的,这个答案有帮助吗? – jdi 2012-04-09 04:11:29

您的just_qualifiers方法返回一个列表或-1(哟!为什么不是一个空列表?)。

你调用它一次,得到的值-1,赋值给TDATA,并立即拨打just_qualifiers AGAIN(为什么?)是这样的:if not just_qualifiers(tdata) == -1:这相当于if not just_qualifiers(-1) == -1:导致函数内部的观测误差 - 这是试图做for line in -1:

我强烈建议你重写该函数,以便它返回一个空列表,如果没有限定符。同样任何其他类似的功能。迭代空列表是非常安全的,即如果data为空,则for line in data:不会优雅地执行任何操作。如果您需要检查是否为空,您可以根据需要简单地执行if data:if not data: