簡體   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