不确定如何解决此覆盖错误

时间:2019-12-04 17:44:53

标签: python-3.x

我有一个功能,提示用户输入他们的名字,姓氏,密码和ID。

我意识到,每次运行此函数时,它只会覆盖这4个变量的先前值。我要实现的是能够运行此功能,然后将详细信息写入文本文件并永久保存,然后可以添加其他用户的详细信息并上载它。目前,当我重新启动程序并运行学生注册功能时,它只是覆盖了以前的变量。也许我不应该将数据存储在变量中?有关如何解决此问题的任何提示?

f = open("studentlogindetails.txt", "a+")
f.write("\n" + firstname + " " + surname + " " + universitypassword + " " + universityid)
f.close()

2 个答案:

答案 0 :(得分:1)

a+模式用于打开要读取和附加的文件。因为它打算被读取,所以在您要立即尝试从文件读取的假设下,将光标放置在文件的最开始。当您尝试写入时,无论光标在哪里,写入的数据都会开始。您想在写之前将光标放在文件的末尾。

如果您不需要阅读信息而只需要写信息,则可以使用a模式,该模式将打开文件以附加信息,并将光标置于文件末尾。

或者,您可以使用f.seek方法将光标手动移动到文件末尾。

文档指出:

  

fileObject.seek(offset [,whence])

     
    

偏移量-这是文件中读/写指针的位置。

         

何时-这是可选的,默认为0,表示文件绝对位置,其他值为1表示相对于当前位置的搜索,2表示相对于文件末尾的搜索。

  

因此,如果要继续使用a+模式,则必须记住在写入之前使用f.seek(0, 2)将光标从文件末尾放置0个字节。

可用的文件打开模式及其用法如下:

  

r :以只读模式打开文件。从文件的开头开始读取,这是open()函数的默认模式。

     

rb :以二进制格式只读打开文件。将光标置于文件的开头。

     

r+ :打开文件进行读写。将光标置于文件的开头。

     

w :在只写模式下打开。将光标置于文件的开头。这将覆盖任何具有相同名称的现有文件。如果不存在同名文件,则会创建一个新文件。

     

wb :除了文件以二进制模式打开以外,其他行为与w相同。

     

w+ :打开文件进行读写。替换所有内容并创建文件(如果不存在)。当您需要写入一个空文件并可能稍后在代码中(在关闭之前)从中读取该文件时,将使用此模式。

     

wb+ :与行为w+相同,只是文件处于二进制模式。

     

a :打开一个文件,用于向其添加新信息。光标位于文件的末尾。如果不存在同名文件,则会创建一个新文件。

     

ab :与行为a相同,只是文件处于二进制模式。

     

a+ :打开一个文件以进行附加和读取。光标位于文件的开头。

     

ab+ :与a+相同,只是文件处于二进制模式。

有关模式的信息已从here中提取并编辑。

答案 1 :(得分:0)

您应该使用with关键字并写入数据,也可以传递append参数。

with open("studentlogindetails.txt", "a") as f:
    # Using f-strings
    f.write(f"{firstname} {surname} {universitypassword} {universityid}")

使用with可确保清除所有资源,即使发生错误也是如此。

注意:如果这只是您正在研究的项目,以学习如何编写文本文件,那么您可能还可以,但是,如果要在生产中使用它,最好使用适当的数据库。

看起来您在大学里写了一些用户数据,您可以使用给每个学生和员工的ID作为主键。

此外,请勿以纯文本格式存储密码,并且请勿实现您自己的哈希算法。存在许多健壮的解决方案。