在python中写入和读取文件

时间:2012-11-24 17:52:28

标签: python python-2.3

我很感激我的家庭作业任何帮助 - 这是一个简单的课程,应该检查一个文件,如果它存在,它读取文件,并将数据加载到程序中,所以你可以列出分数,并添加更多。它的假定只保留前5个分数。

然后当你关闭程序时(通过选择选项0),它应该将前5个分数写入scores.txt文件。我认为我能够正常工作,我只是无法让程序正确阅读和填充scores文件。

到目前为止,这是我的代码:

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.")

1 个答案:

答案 0 :(得分:1)

您应该尝试在Comma-Separated-Value (CSV)中编写文件。虽然该术语使用“逗号”一词,但格式实际上只意味着任何类型的一致字段分隔符,每条记录在一行上。

Python有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对您来说可能不熟悉。这是一个匿名函数。我们在这里使用它来告诉sort函数在哪里找到比较密钥。在这种情况下,我们对分数列表中的每个项目说,使用分数字段(索引1)进行比较。