Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从python中删除分数并将其插入文本文件_Python_Python 3.x_Text Files - Fatal编程技术网

从python中删除分数并将其插入文本文件

从python中删除分数并将其插入文本文件,python,python-3.x,text-files,Python,Python 3.x,Text Files,我在Python3.3中创建了一个基于文本的游戏,用户可以为他们的角色选择一个类。我希望游戏存储三个分数,这样就可以取平均值。我的问题是,我不确定如何让程序在文件中搜索名称并删除其中最旧的分数,这就是保存分数的文件的外观: Bennie 33 62 94 Josh 82 55 31 Jackie 10 4 3 我目前的代码,看看他们是否做过游戏之前,如果没有写在那里的分数到文件中,如果他们有我有代码分割线,并读取他们。它需要删除他们名字前的分数柜,并在下一个名字前插入新的分数,但我不确定怎么做

我在Python3.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()    

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

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

我将创建几个名为“\u 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]))
然而,我建议你只保留这些统计数据,你以后可能会需要它们,而且文本很便宜。与读取所有行不同,只需打开要追加的文件,读取最后三行,并在获得新stat时将新stat追加到末尾,即

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方法,向文件添加分数(伪代码),根据需要进行修改以满足您的需要(您的要求不是最有效的方法):

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

完成添加分数和操作文件后,可以通过将
updated_文本
写回文件来更新文件。(如果文件已在
read
模式下打开,您可能需要关闭它,然后在
write
模式下重新打开它)

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

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

例如,请参见

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

我认为如果你想使用一个文件,那么添加和提取数据会容易得多。你是否只限于使用文件?这是一个永远不会成长的小项目吗?如果没有上述问题,您可以使用类似sqlite3的DB。该程序很小,因此不会增长。如果这是家庭作业,纳什可能不允许使用
config
或数据库之类的东西,即使他们知道如何在Python中使用这些东西。@PM2Ring是正确的,我不允许使用配置和数据库,所以我必须坚持使用.txt文件。这不是家庭作业,只是我设置的任务,因此允许我使用堆栈溢出。您的代码不处理文件中的名称。此外,分数为
int
,not
float
。为此,我在需要的地方复制了我的代码,但它似乎没有做任何事情。当它应该运行时,我得到了部分,但它对文件没有任何作用。它似乎对文件没有任何作用,并循环返回到再次询问我的类,因此我假设它正在中断并循环回我的类。while true:有没有停止的方法that@Nasher,该函数不会更改文件,您应该将
更新的\u文本
重新写入该文件,以便更改该文件。函数接受文件的内容并返回更新的内容,您应该再次将它们写回文件以更新文件file@Nasher,我将暂时离线,但如果需要进一步澄清,请随时发表评论。如前所述,您使用的解决方案和方案并不是最有效的,例如,您可以为每个用户创建一个文件,并使用更简单的格式。但是因为这是你问的问题,所以我给出了这个答案对不起,如果这真的很基本,我听起来很愚蠢,但是我如何再次将它写入文件@尼科斯M@Nasher,没关系,例如,检查一下。您可以检查python I/O文件方法,就像您已经使用了
.read
方法一样
file.write(updated_text)