删除乐谱并将其插入文本文件表单 python

Deleting and inserting a score into a text file form python

我在 python 3.3 中创建了一个基于文本的游戏,用户为他们的角色选择 class。我想让游戏存储三个分数,以便取平均值。我的问题是我不确定如何让程序在文件中搜索名称并删除最旧的乐谱,这就是保存乐谱的文件的样子:

Bennie
33
62
94
Josh
82
55
31
Jackie
10
4
3

我当前的代码可以查看他们之前是否玩过游戏,如果没有,则将分数写入文件,如果他们有我有代码来拆分行并读取它们。它需要删除接近他们名字的乐谱,并在下一个名字之前插入新乐谱,但我不确定如何执行此操作。这是我当前的代码

    class_choice = input('Enter Class one, Class two or Class three.')
    if class_choice == "One":
        text_file = 'class1.txt'
    elif class_choice == "Two":
        text_file = 'class2.txt'
    elif class_choice == "Three":
        text_file = 'class3.txt'
    else:
        False
    first_time = input('Is this the first you have completed this game: Yes or No?')
    if first_time == 'Yes':
        with open(text_file, "a") as file:
            file.write("{}\n".format(name))
            file.write("0\n")               
            file.write("0\n")   
            file.write("{}\n".format(score))                
            sys.exit()
    else:
        file = open(text_file, 'r')
        lines = file.read().splitlines()    

无法更改文件中的一行。您只能在文件末尾附加内容或覆盖整个内容。 如果要将分数存储在文件中,则需要逐行读取文件,将每一行存储在辅助变量(连接行)中,当到达需要修改的行时,将修改后的行连接到辅助变量中.然后继续逐行读取文件,存入辅助变量。 完成后,记下文件中辅助变量的内容。

My problem is that i am unsure how to get the program to search for a name in the file and delete there oldest score

我会创建几个名为“< class >_stats[.txt]”(显然没有空格)的 .txt(或 .dat)文件。从那里:

class_choice = raw_input("Choose your class")
# if needing stats
f = open("%s_stats.txt" % class_choice, "r+")
lines = f.readlines()  
f.close()

stats = [float(i) for i in lines]  # i.e. [3, 5.5, 4]

# rest of game
# overwrite with new stats
new_stat = get_new_stat()
f = open("%s_stats.txt" % class_choice, "w")
f.write("\n".join([str(i) for i in stats]))

但是,我建议只保留统计数据,您以后可能会需要它们,而且文字很便宜。无需读取所有行,只需打开文件进行追加,读取最后三个,并在获得新统计数据时将新统计数据追加到末尾,即

f = open("%s_stats.txt")
lines = f.readlines[-3:]  # reads last 3
f.close()
# stuff
f = open("%s_stats.txt", "a")
f.write(get_new_stat())
f.close()

提供示例 python 向文件添加分数的方法(伪代码)根据需要修改以满足您的需要(您的要求不是最有效的方法):

def add_score(user, score, text_file):
    lines = text_file.splitlines()
    count = len(lines)
    user_exists = False
    user_index = -1
    num_scores = 3
    user_num_scores = 0
    for i in range(count-1):
        line = lines[i]
        if user == line:
            # user previous scores start after here
            user_exists = True
            user_index = i
            break

    if not user_exists:
        # user does not exist, create by appending
        lines.append(user)  
        lines.append(str(score)) 
    else: # user exists, fix the scores 
        j=1
        while j <= num_scores:
            line = lines[user_index+j]
            j += 1
            if line.isdigit():
               # user score line
               user_num_scores +=1
        if user_num_scores == num_scores:
            for i in range(1,num_scores-1): lines[user_index+i] = lines[user_index+i+1] # shift up
            lines[user_index+num_scores] = str(score) # add the latest score  
        else: # just append/insert the score, as the previous scores are less than num_scores
            lines.insert(user_index+user_num_scores, str(score))

    return "\n".join(lines)   # return the new text_file back

这样使用:

text = file.read()
updated_text = add_score('UserName', 32, text)

注意给定的函数将不改变文件它只会对给定的文件内容进行操作(作为 text_file 参数)。这是有目的的,因为如果函数本身操纵文件,它将限制它的使用,因为人们可以在整个应用程序的任何方便的瞬间读取或写入文件。所以这个函数只对字符串进行操作。这不是最有效的方法,例如可以为每个用户使用一个文件和一种更简单的格式,但由于这个答案所要求的仅涵盖这一点。

当您完成添加分数和操作文件后,您可以通过将 updated_text 写回文件来更新文件。 (可能如果文件已经在 read 模式下打开,您将不得不关闭它并在 write 模式下重新打开它)。

要用新内容写入(更新)文件,请使用以下方法:

file.write(updated_text)

例如见here for python file I/O operations

您为什么不尝试创建一个 .ini 文件并将您的数据存储在部分下的属性中。它的框架适合您的要求。它有点像 xml 文件,但由于您的输入和输出参数有限(如您所述;3 分),它似乎是最好的选择。只需使用 python 文档中的 python 完成 ini 文件操作,您就会知道该怎么做。干杯!