附加到文件的最大数据片段

时间:2014-02-17 23:11:35

标签: python sorting file-io max

我有一段代码将用户名和分数附加到文件中,但我想知道如何制作它,以便任何时候只有10个名称和分数可以在文件中。我的代码如下:

def storescores():
    hs = open("hst.txt", "a")
    hs.write(name + " ")
    hs.write(str(score) + "\n")
    hs.close()

有没有办法让它如果10个名字已经在列表中,那么就不能再添加了?如果这需要某种形式的排序方法(选择,泡泡等),那么你也可以把它放进去吗?

2 个答案:

答案 0 :(得分:0)

没有内置的方法来做这样的事情。你需要做的是像

  1. 读入文件
  2. 添加最新分数
  3. 检查列表以查看是否有太多分数,如果有,请删除一个
  4. 写文件

答案 1 :(得分:0)

首先,无论你做什么,都需要从文件中读取最多10行。

如果您只想保留前10个分数,然后停止记录新分数,这很容易。我将使用linecache模块来提高效率(因此,如果您连续1000次调用storescores,它会记住它已经在寻找并且未能找到第10行)。如果少于10行,则返回空字符串;如果有10行或10行,则返回第10行。所以:

def storescores():
    if linecache.getline("hst.txt", 10):
        print("Already stored 10 scores, sorry")
        return
    hs.close()
    hs = open("hst.txt", "a")
    hs.write(name + " ")
    hs.write(str(score) + "\n")
    hs.close()

如果您想要最近的10个分数,则必须阅读这些内容,然后写出新文件。像这样:

def storescores():
    with open("hst.txt") as hs:
        lines = list(hs)
    lines.append(name + " " + score + "\n")
    lines = lines[-10:]
    with open("hst.txt", "w") as hs:
        for line in lines:
            hs.write(line)

如果你想要 top 10分,你可以做同样的事情,但在中间添加一个排序步骤。没有理由编写明确的选择排序或冒泡排序 - 事实上,你不想这样做,因为这些算法首先不是好的排序算法。只需在列表中调用sort方法。

棘手的一点是你想要对得分进行排序,而不是整行(否则“Bob 100”的得分高于“Andrew 200”),并且得分作为数字而不是字符串(否则,“2”的分数高于“10”)。因此,您需要一个key function来分割字符串,取最后一位,并将其转换为数字。所以:

def storescores():
    with open("hst.txt") as hs:
        lines = list(hs)
    lines.append(name + " " + score + "\n")
    lines.sort(key=lambda line: int(line.split()[-1]))
    lines = lines[-10:]
    with open("hst.txt", "w") as hs:
        for line in lines:
            hs.write(line)

有进一步改善这种情况的方法。例如,您可能希望写入新的临时文件,然后在完成后将其复制到文件上(因此如果有人在程序运行过程中拔出插件,而不是在原地重写文件)以旧分数或新分数结束,而不是截断的部分文件。或者您可能希望以最聪明的方式使用heapqbisect模块将新分数放入适当的排序位置,而不是重新排序整个已排序的列表(并不重要。只有10个条目)。等等。但这应该足以让你开始。