附加到fi的最大数据块数

2024-06-12 15:25:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一段代码,附加了一个用户名和分数到一个文件,但我想知道我如何才能使它,只有10个名字和分数可以在任何时候的文件。我的代码如下:

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

有没有什么办法,如果名单上已经有10个名字,那么就不能再加了?如果这需要某种形式的排序方法(选择、冒泡等),那么你能把它也放进去吗?你知道吗


Tags: 文件代码nametxtdefopen名字分数
2条回答

做这样的事没有内在的方法。你需要做的是

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

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

如果你只想保留前10个分数,然后停止记录新的分数,那很简单。为了提高效率,我将使用^{}模块(因此,如果您连续调用storescores1000次,它将记住它已经在查找第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)

如果你想要Tope>EEM > 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)

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

相关问题 更多 >