python - 如何删除和重写没有未知字符的行?
问题描述
我有一个 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,
非常感谢支持
随意更改代码,因为它已经是一团糟
提前致谢
解决方案
这应该很容易。基本思想是:
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”文件,将内存中的所有行写入并输出到文件中。
推荐阅读
- debian - 在 Beaglebone green 上交叉编译 debian
- python-3.x - python中一些简单列表和if语句的错误
- ios - 黑色导航栏覆盖集合视图标题中的图像视图
- java - 如何使用 Gradle 4.4 创建一个包含所有依赖项的 jar?
- python - 无法索引
- python - 从读取 csv 转换为 excel - pandas/python
- tfs - 将 Visio 文件附加到 TFS 2018 Wiki 页面
- asp.net-core - Razor Pages 路由技术
- git - 子模块的git公共子模块
- php - 从一个 php 文件生成时的自定义 URL