2012-11-24 7 views
0

숙제 할당에 도움을 주시면 감사하겠습니다. 파일을 확인해야하는 클래스에 대한 간단한 프로그램입니다. 파일이 있으면 파일을 읽고로드합니다. 데이터를 프로그램에 추가하여 점수를 나열하고 더 많은 점수를 추가 할 수 있습니다. 그 가정 상위 5 점만 유지.파이썬에서 파일 쓰기 및 읽기

그런 다음 프로그램을 닫을 때 (옵션 0을 선택하면) 상위 5 개 점수를 scores.txt 파일에 작성해야합니다. 제대로 작동 할 수 있다고 생각합니다. 프로그램을 올바르게 읽고 scores 파일을 채우는 데 문제가 있습니다. 당신은 Comma-Separated-Value (CSV)에서 파일을 작성하려고한다

scores = [] 

#Check to see if the file exists 
try: 
    file = open("scores.txt") 
    for i in range(0, 5): 
     name = file.readline() 
     score = file.readline() 
     entry = (score, name) 
     scores.append(entry) 
     scores.sort() 
     scores.reverse() 
     scores = scores[:5] 
    file.close() 
except IOError: 
    print "Sorry could not open file, please check path." 


choice = None 
while choice != "0": 

    print """ 
    High Scores 2.0 

    0 - Quit 
    1 - List Scores 
    2 - Add a Score 
    """ 


    choice = raw_input("Choice: ") 
    print "" 

    # exit 
    if choice == "0": 
     print "Good-bye." 
     file = open("scores.txt", "w+") 
     #I kinda sorta get this now... kinda... 
     for entry in scores: 
      score, name = entry 
      file.write(name) 
      file.write('\n') 
      file.write(str(score)) 
      file.write('\n') 
     file.close() 

    # display high-score table 
    elif choice == "1": 
     print "High Scores\n" 
     print "NAME\tSCORE" 
     for entry in scores: 
      score, name = entry  
      print name, "\t", score 

    # add a score 
    elif choice == "2": 
     name = raw_input("What is the player's name?: ") 
     score = int(raw_input("What score did the player get?: ")) 
     entry = (score, name) 
     scores.append(entry) 
     scores.sort() 
     scores.reverse() 
     scores = scores[:5]  # keep only top 5 scores 

    # some unknown choice 
    else: 
     print "Sorry, but", choice, "isn't a valid choice." 

raw_input("\n\nPress the enter key to exit.") 
+0

게시물을 약간 다시 포맷했습니다. 한 번에 한 가지만 편집하십시오. –

+0

감사합니다. 나는 그것을 기억할 것이다. –

+1

다른 줄에있는 각 필드 대신 CSV 형식으로 파일을 작성하면 훨씬 쉽습니다. – jdi

답변

1

:

여기에 지금까지 내 코드입니다. 이 용어는 "쉼표"라는 단어를 사용하지만 형식은 실제로 한 줄에 각 레코드가있는 일관된 필드 구분 기호 유형을 의미합니다.

파이썬은이 형식의 읽기 및 쓰기를 돕기 위해 csv module을 가지고 있습니다. 그러나 나는 그것을 무시하고 당신의 숙제를 위해 수동으로 할 것입니다.

내가 쉼표를 사용하고
Bob,100 
Jane,500 
Jerry,10 
Bill,5 
James,5000 
Sara,250 

은 여기 :

의는이 같은 파일이 있다고 가정하자.

f = open("scores.txt", "r") 
scores = [] 
for line in f: 
    line = line.strip() 
    if not line: 
     continue 
    name, score = line.strip().split(",") 
    scores.append((name.strip(), int(score.strip()))) 

print scores 
""" 
[('Bob', 100), 
('Jane', 500), 
('Jerry', 10), 
('Bill', 5), 
('James', 5000), 
('Sara', 250)] 
""" 

읽고 읽고 추가 할 때마다 목록을 정렬 할 필요가 없습니다. 마지막에 한 번만 수행 할 수 있습니다.

scores.sort(reverse=True, key=lambda item: item[1]) 
top5 = scores[:5] 

나는 lambda이 (가) 새로운 것을 알고 있습니다. 이것은 익명의 기능입니다. 여기서 비교를위한 키를 찾을 수있는 정렬 함수를 알려주기 위해이 함수를 사용합니다. 이 경우 점수 목록의 각 항목에 대해 비교를 위해 점수 필드 (색인 1)를 사용합니다.

+0

나는 그것을 약간 재 작업해야했지만 효과가 있었다. 주로 나는'scores.append (name, score)'를'scores.append (score, 이름)'. 그것들을 거꾸로 읽고 있었기 때문에 혼란 스러웠습니다. 하. 대단히 감사합니다. –

+0

오케이. 그럼 당신이 그 순서로 그들을 저장하는 경우 정렬에서 열쇠 람다가 필요하지 않습니다. 그것은 단지 첫 번째 인덱스를 사용합니다 – jdi

+0

그것도 알아 냈습니다;) 도와 주셔서 고마워요. –