如何在读取我的文件但删除一个变量然后替换它时删除“\n”字符

How do I remove the "\n" characters when reading my file but deleting one variable then replacing it

我正在尝试制作一个程序,该程序从文件中读取并删除其中的一个特定行,然后将所有存储的数据放回文件中,并用新行分隔。该文件使用此格式:

Jones|20|20|00
bob|30|19|90
James|40|19|80

所以我要删除(备份包含这个并且是我要删除的行)
bob|30|19|90
但是我正在使用的代码删除了新行并且没有替换它但是当我尝试向它添加 \n 时文件不想读取它这样做(添加 2“\n”s):

Jones|20|20|00

James|40|19|80

我正在使用以下代码:

def deleteccsaver(backup):
lockaccount =""
lockaccount = lockaccount.strip("\n")
with open('accounts_project.txt','r+') as f:
    newline=[]
    for line in f.readlines():
        newline.append(line.replace(backup, lockaccount).strip("\n"))
with open('accounts_project.txt','w+') as f:
    for line in newline:
            f.writelines(line +"\n")
    f.close()
    resetlogin()

请帮忙,因为我不知道如何将 \n 添加回去而不显示为“\n\n”
没有“\n”它显示为:

Jones|20|20|00James|40|19|80

任何建议:

我在这里做的是一次读取整个文件,如果你有一个非常非常大的文件,请不要这样做。一次读取所有文件内容后,我使用“\n”作为分隔符从中列出一个列表。阅读 python 中的 split 函数以了解更多信息。然后从列表中我用 lockaccount 替换备份,因为你一直在做同样的事情,这些是你正在使用的变量的名称,希望在这种情况下我没有混淆它们。然后在列表的每个元素之后添加新行后,它将被保存到一个新文件中,即前一个文件的每一行。这将导致结果文件具有与先前文件相同的所有内容,但删除了您想要删除的内容。我看到 lockaccount 本身是一个空字符串,因此添加它可能会在您的文件中创建一个换行符。如果您不希望 lockaccount 替换文件中的备份变量,只需使用 contents.remove(backup) 而不是 contents[contents.index(backup)] == lockaccount 从列表中删除备份,保持其余代码不变。希望这解释得更好。

def deleteccsaver(backup):
    lockaccount =""
    lockaccount = lockaccount.strip("\n")
    with open('accounts_project.txt','r+') as f:
        contents = f.read().split("\n")
        if backup in contents:
            contents[contents.index(backup)] = lockaccount
        new_contents = "\n".join(contents)
    with open('accounts_project.txt','w+') as f:
        f.write(new_contents)
    resetlogin()

您在列表中的每个元素之后添加了一个换行符。所以,如果你用空字符串替换一行,那么,你将得到一个空行。

尝试简单地跳过要删除的行:

if line == backup:
    contiune
else:
    lines.append(...)

PS。上面的代码还有改进的余地,但我在phone,如果没有人领先我,我会稍后回来编辑

您可以尝试在第一个 for 循环之后添加 newline = '\n'.join(newline),然后不使用循环将其写入 accounts_project.txt 文件。 代码应如下所示:

def deleteccsaver(backup):
lockaccount =""
lockaccount = lockaccount.strip("\n")
with open('accounts_project.txt','r+') as f:
    newline=[]
    for line in f.readlines():
        newline.append(line.replace(backup, lockaccount).strip("\n"))
    newline = '\n'.join(newline)
with open('accounts_project.txt','w+') as f:
    f.write(newline)
    f.close() # you don't necessarily need it inside a with statement
    resetlogin()

编辑:

以上代码仍然会导致

Jones|20|20|00

James|40|19|80

作为输出。

这是因为在替换循环期间,空字符串将附加到 newline(如 newline: ['Jones|20|20|00','','James|40|19|80']),然后 newline = '\n'.join(newline) 将导致 'Jones|20|20|00\n\nJames|40|19|80'.

一个可能的解决方法是替换:

for line in f.readlines():
    newline.append(line.replace(backup, lockaccount).strip("\n"))

for line in f.readlines():
    line = line.strip('\n')
    if line != backup:
        newline.append(line)
def deleteccsaver(backup):
lockaccount =""
lockaccount = lockaccount.strip("\n")
with open('accounts_project.txt','r+') as f:
    contents = f.read().split("\n")
    if backup in contents:
        contents.remove(backup)
    new_contents = "\n".join(contents)
with open('accounts_project.txt','w+') as f:
    f.write(new_contents)
resetlogin()