2012-04-09 2 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

+3

오류가 여전히 나타나는 작은 예제로 잘라 내려고 했습니까? – gbulmer

+0

agf 님의 댓글을 지우기. 여기 사람들은 문제를보기 위해 여분의 일을하지 않으면 도움이 될 것입니다. – octern

답변

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 

참조 하시겠습니까? 여기서 글로벌 변수 tdata[3] 대신 data?

+0

고마워, 그리고 그것에 대해 미안해 :(나는 StackOverflow를 사용하는 것에 익숙하다. – UnderWulf

+0

@UnderWulf : 이해할 수있다.이 사이트의 질문으로 인해, 높은 평판을 가진 사람들은이 상황을 수치로 볼 수 있었고, 질문에 대한 답변을 짧고 직접적으로 작성하면 가장 좋은 답변을 얻을 수 있습니다. SO 사용자는 큰 스크립트에 대한 코드 리뷰에 매우 불리합니다.이 답변이 도움이 되었습니까? – jdi

0

귀하의 just_qualifiers 메서드는 목록 또는 -1 (yuk! 왜 비어있는 목록이 아닌가?) 중 하나를 반환합니다. 당신은 한 번 전화

, 값을 얻을 -1, TDATA에 그를 할당하고, 즉시 다시 just_qualifiers 전화 (왜?)이 같은 : if not just_qualifiers(tdata) == -1: 함수 내에서 관찰 된 오류가 발생 if not just_qualifiers(-1) == -1:에 해당하는 - 그것이 하려고 할 때 for line in -1:

한정자가 없으면 빈 목록을 반환하도록 해당 함수를 다시 작성하는 것이 좋습니다. 다른 유사한 기능과 비슷합니다. 빈 목록을 반복하는 것이 안전합니다. 즉, for line in data:data이 비어있는 경우 아무런 반응이 없습니다. 비어 있는지 확인해야 할 경우 if data: 또는 if not data:을 원하는대로 간단히 수행 할 수 있습니다.

관련 문제