首页 > 解决方案 > 如何删除和重写没有未知字符的行?

问题描述

我有一个 database.txt 文件,第一列是用户名,第二个密码,其余 5 个恢复问题和答案交替出现。我希望允许用户能够更改其详细信息的密码,而不会影响其他用户的用户名,因为它们可能相同。我找到了一种方法来删除前一个并将新的修改细节行附加到文件中。但是,附加行的开头始终是字符串或未知字符。AND 其他字符正在更改,而不是列表中的第二个值。请帮助我找到避免这种情况的方法。 https://repl.it/repls/NecessaryBoldButtons你可以在这里找到代码,更改它会影响每个人,所以请复制到别处。

https://onlinegdb.com/BJbsn9-cL

我只需要在用户输入而不是其他字符串上更改密码,所有这些代码的原因是在更改一个人的密码时可以更改另一个用户名。这是原始文件

这就是之后发生的情况,其中 data[0] = "bye" 的行列表中的第二个字符串应该只更改为 newpass,而不是所有其他字符串

''' 导入线缓存

f = open("database.txt" , "r+")
for loop in range(3):
  line = f.readline()
  data = line.split(",")
  if data[1] == "bye":
    print(data[1])  #These are to help me understand what is happening
    print(data[0])
    b = data[0]
    newpass = "Hi"
    a = data[1]

    fn = 'database.txt'
    e = open(fn)
    output = []
    str="happy"
    for line in e:
      if not line.startswith(str):
        output.append(line)
    e.close()
    print(output)
    e = open(fn, 'w')
    e.writelines(output)
    e.close()

    line1 = linecache.getline("database.txt" ,loop+1)
    print(line)
    password = True
    print("Password Valid\n")
    write = (line1.replace(a, newpass))
    write = f.write(line1.replace(a, newpass))

f.close()

'''

这是文本文件:

用户名,密码,Recovery1,Answer1,Recovery2,Answer2,Recovery3,Answer3,Recovery4,Answer4,

Recovery5,Answer5,o,o,o,o,o,o,o,o,o,o,

快乐,再见,o,o,o,o,o,o,o,o,o,o,

再见,快乐,o,o,o,o,o,o,o,o,o,o,

非常感谢支持

随意更改代码,因为它已经是一团糟

提前致谢

标签: pythonalgorithmfile

解决方案


这应该很容易。基本思想是:

open input file for reading
open output file for writing
for each line in input file
    if password = "happy"
        change user name in line
    write line to output file

将其转换为 python 应该很容易。

通过评论和检查您的代码,我感觉您正在尝试就地更新一行。也就是说,看起来您的期望是给定包含以下内容的文件“database.txt”:

username,password,Recovery1,Answer1,Recovery2,Answer2,Recovery3,Answer3, Recovery4,Answer4,Recovery5,Answer5,
o,o,o,o,o,o,o,o,o,o,
happy,bye,o,o,o,o,o,o,o,o,o,o,
bye,happy,o,o,o,o,o,o,o,o,o,o,

当您进行更改时,您的新“database.txt”将包含以下内容:

username,password,Recovery1,Answer1,Recovery2,Answer2,Recovery3,Answer3, Recovery4,Answer4,Recovery5,Answer5,
o,o,o,o,o,o,o,o,o,o,
happy,Hi,o,o,o,o,o,o,o,o,o,o,
bye,happy,o,o,o,o,o,o,o,o,o,o,

你可以做到这一点,但你不能就地做到这一点。您必须将文件的所有行(包括更改的行)写入新的临时文件。然后您可以删除旧的“database.txt”并重命名临时文件。

您不能更新文本文件中的一行,因为如果您更改行的长度,那么您将在您更改的行的末尾有额外的空间(因为新行的字符少于旧行行),否则您将覆盖下一行的开头(新行比旧行长)。

唯一的其他选择是将所有行加载到内存中并关闭文件。然后在内存中更改要更改的一行或多行。最后,打开“database.txt”文件,将内存中的所有行写入并输出到文件中。


推荐阅读