删除并将分数插入到python的文本文件中

时间:2015-04-12 11:09:35

标签: python python-3.x text-files

我在python 3.3中创建了一个基于文本的游戏,用户为他们的角色挑选了一个类。我希望游戏存储三个分数,这样就可以获得平均分。我的问题是我不确定如何让程序在文件中搜索名称并删除最旧的分数,这就是保存分数的文件看起来像:

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()    

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

给出一个示例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

答案 2 :(得分:0)

为什么不尝试创建.ini文件并将数据存储在各节下的属性中。它的框架适合您的要求。它的工作方式类似于xml文件,但是由于您的输入和输出参数是有限的(如您所述; 3分),因此这似乎是最佳选择。只需在python docs中使用python进行ini文件操作,您就会知道该怎么做。干杯!

答案 3 :(得分:-1)

  

我的问题是我不确定如何让程序在文件中搜索名称并删除最旧的分数

我会创建几个名为“&lt; class&gt; _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()