【问题标题】:Using python to write onto 2 different lines in a .txt file使用 python 在 .txt 文件中写入 2 个不同的行
【发布时间】:2018-07-06 22:17:07
【问题描述】:

我正在使用 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 文件中,它应该跳过这部分。如果您像这样删除“\n”:

text.write("buffer %s" %NewPassword)

它现在可以在您下次运行时正确跳过此步骤。有没有办法实现这种跳过,同时将用户输入部分写入不同的行?

【问题讨论】:

  • 同一个文件不要打开两次,删除第一个open。此外,适当地格式化您的代码。正如所写,它在语法上是不正确的。
  • 首先,由于 IndentationErrors,此代码无法运行。其次,不清楚你的问题是什么。你能给我们一个样本输入和预期与实际输出吗?或者给出你正在谈论的代码的两个版本,以及每种情况下的实际输出?或类似的东西? (请确保您在此处发布的任何内容实际上确实重现了您所询问的行为。)
  • @DyZ 虽然这是一件很奇怪的事情,但我认为这实际上并不是造成问题的原因。在第二个(或者更确切地说,第四个)open 之后,旧文件对象再也不会被使用,因此尝试使用它会造成巨大混乱的事实实际上并不重要。 (当然,除了它使代码读起来非常混乱——尤其是在循环内为另一个变量重用循环变量名,但随后执行break 这样也没关系......)
  • @abarnert 对最初的缩进错误感到抱歉,现在已修复。我对此还是很陌生。添加文本以进一步阐明问题。

标签: python


【解决方案1】:

我会猜测一下,试图解释一下:

当您第一次运行代码时,它正确地看到文件只是一个空格,因此它要求输入密码并将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)

【讨论】:

    猜你喜欢
    • 2016-12-31
    • 1970-01-01
    • 2021-06-06
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 2021-07-15
    相关资源
    最近更新 更多