繁体   English   中英

如何在读取文件但删除一个变量然后替换它时删除“\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”):

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 中的拆分 function 以了解更多信息。 然后从列表中我用 lockaccount 替换备份,因为你一直在做同样的事情,这些是你正在使用的变量的名称,希望在这种情况下我没有混淆它们。 然后在列表的每个元素后添加新行后将其保存到新文件中,即前一个文件的每一行。 这将导致结果文件的所有内容都与以前的文件相同,但会删除您要删除的内容。 我看到 lockaccount 本身是一个空字符串,因此添加它可能会在您的文件中创建一个换行符。 如果您不希望 lockaccount 替换文件中的备份变量,只需使用contents.remove(backup)而不是contents[contents.index(backup)] == lockaccount从列表中删除备份,保持代码的 rest 相同. 希望这能更好地解释。

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。 上面的代码还有改进的余地,但我正在打电话,如果没有人抢先我,我会稍后回复编辑

您可以尝试在第一个 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

作为 output。

这是因为在替换循环期间,一个空字符串将附加到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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM