我正在使用python写入.txt文件。该程序需要首先在第一行中添加一些内容(在本例中为“缓冲区”),然后由用户在其下一行中编写自定义输入。该程序当前如下所示:
try:
text = open("myconfig.txt", "x")
text = open("myconfig.txt", "w")
text.write(" ")
text.close()
except FileExistsError:
print("File already exists")
text = open("myconfig.txt", "rt")
for line in text:
if "buffer" not in line:
NewPassword = input("Create a new Password: ")
text = open("myconfig.txt", "a")
text.write("buffer \n%s" % NewPassword)
text.close()
break
pass
问题是该程序应该首先在.txt文件中检查单词“ buffer”,如果该文件存在于.txt中,它将跳过书写部分。如果您删除\ n以更改其写入内容,则效果很好。添加\ n后,似乎不再在.txt文件中找到“缓冲区”,并且继续重复初始写入过程。 程序是否有办法找到“缓冲区”一词,但仍将第二部分写到它下面的行中? 先感谢您。 编辑:为进一步阐明问题,使用上面至少写的代码两次,将以下输出输出到.txt文件中:
buffer
adminbuffer
admin
其中“ admin”是用户输入的文本。现在应该发生的事情是它应该只写入一次,并且如果.txt文件中已经存在单词“ buffer”,则应该跳过这一部分。如果您这样删除“ \ n”:
text.write("buffer %s" %NewPassword)
现在,下次运行它时,它会正确跳过此步骤。有没有一种方法可以实现这种跳过,但又可以将用户输入部分写到另一行上?
答案 0 :(得分:0)
我将尝试解释一下:
第一次运行代码时,它会正确地看到该文件只是一个空格,因此它要求输入密码,并将buffer \n
添加到该空格行,然后将密码写在下一行。
第二次运行代码时,您希望它看到buffer
已经存在并且什么也不做。
但这不是您要检查的内容。您正在检查每行,以查看是否有buffer
,而不是整个文件。
因此,第二次运行它:对于第一行" buffer \n"
,"buffer"
在该行中,因此它什么也不做。对于第二行(即用户密码),"buffer"
可能不在密码中。因此,它要求输入新密码并再次附加。
如果要检查"buffer"
是否出现在文件中的任何位置,有两种方法可以实现。
首先,检查每一行,仅在未找到"buffer"
的情况下进行写作:
for line in text:
if "buffer" in line:
break
else:
NewPassword = input("Create a new Password: ")
text = open("myconfig.txt", "a")
text.write("buffer \n%s" % NewPassword)
text.close()
或者,由于此文件很容易变小到足以将整个内容读取到内存中,因此请执行以下操作:
if "buffer" not in text.read():
NewPassword = input("Create a new Password: ")
text = open("myconfig.txt", "a")
text.write("buffer \n%s" % NewPassword)
text.close()
无论哪种方式,如果我正确地猜到了您的问题,都应该可以解决。
它仍然是令人困惑的代码。具有多个文件对象同时引用同一文件几乎总是一团糟。使用相同的变量表示多个不同的值(尤其是循环迭代变量和循环内部使用的变量)会产生误导。等等。但是我认为您可以避免所有这些事情-打开下一个对象后,您碰巧不再使用任何文件对象,在重新分配循环变量后立即break
,依此类推。清理它,所以显然是正确的。例如:
try:
with open("myconfig.txt", "x") as text:
text.write(" ")
except FileExistsError:
print("File already exists")
with open("myconfig.txt", "r") as text:
hasbuffer = "buffer" in text.read()
if not hasbuffer:
NewPassword = input("Create a new Password: ")
with open("myconfig.txt", "a") as text:
text.write("buffer \n%s" % NewPassword)