2012-04-09 180 views
-3

該程序會迭代,但只有一直到某一行代碼。然後它開始讀取啓動和停止變量,如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

回答

0

我不打算檢討整個程序摸不着頭腦,但我沒趕上一件事一目瞭然,爲你追蹤的一部分:

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

感謝,並對此抱歉:(我是新來使用StackOverflow – UnderWulf 2012-04-09 03:57:18

+0

@UnderWulf:可以理解隨着本網站的問題數量,那些具有較高聲譽的人已經看到了這種情況數量可觀的時間,它最終幾乎是機械如果你的問題簡單直接,你會得到最好的答案,SO上的人對於大型腳本的代碼評審是非常不利的,這個答案有幫助嗎? – jdi 2012-04-09 04:11:29

0

您的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: