我有一个功能,提示用户输入他们的名字,姓氏,密码和ID。
我意识到,每次运行此函数时,它只会覆盖这4个变量的先前值。我要实现的是能够运行此功能,然后将详细信息写入文本文件并永久保存,然后可以添加其他用户的详细信息并上载它。目前,当我重新启动程序并运行学生注册功能时,它只是覆盖了以前的变量。也许我不应该将数据存储在变量中?有关如何解决此问题的任何提示?
f = open("studentlogindetails.txt", "a+")
f.write("\n" + firstname + " " + surname + " " + universitypassword + " " + universityid)
f.close()
答案 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作为主键。
此外,请勿以纯文本格式存储密码,并且请勿实现您自己的哈希算法。存在许多健壮的解决方案。