幾個側面說明:當你打電話string.replace(string, "")
,你告訴字符串以替換其整個自我空字符串,你可能也只是做string = ""
。假定第一個string
是要替換的搜索字符串,所以給它一個不同的名稱,然後將其用作例如string.replace(searchString, "")
。另外,您不想命名變量string
,因爲它是標準庫模塊的名稱。你正在調用你的輸入文件「outfile」,這很容易混淆。您可能想要使用with
語句而不是顯式關閉。最後,你可以迭代文件中的行,只需for line in f:
;你不需要for line in f.readlines()
(並且,如果你需要處理的Python 2.x中,你會更樂意迴避readlines()
,因爲它會讀取整個文件到內存中,然後使一個巨大的內存中的行列表)。
第一個問題,因爲JBernardo指出,是你已經打開的「一」模式中的文件,這意味着「只寫的,追加到結束。」如果你想讀和寫,你可以使用「a +」或「r +」。
但是,這不會真的幫助你。畢竟,在讀取文件的過程中,您無法寫入文件。
有幾種常見的解決方法。
首先,只寫到標準輸出,並讓用戶做任何他想要的結果,如,它重定向到一個文件。 (在這種情況下,你必須打印提示,「完成」的消息,等等標準錯誤,而不是,所以他們不重定向到文件中。)這是許多Unix工具,如sed
或sort
做的,所以它是適當的如果你正在構建一個Unix風格的工具,但可能不適合其他用途。
def stderrinput(prompt):
sys.stderr.write(prompt)
sys.stderr.flush()
return input()
def main():
with open(stderrinput("Enter a file name: "), "r") as infile:
searchString = stderrinput("Enter the string to be removed: ")
for line in infile:
print(infile.replace(searchString, ""))
sys.stderr.write("Done\n")
其次,寫入另一個文件。在打開的「R」模式下的輸入文件,並在「W」模式輸出文件,然後你只是拷貝線:
def main():
inpath = input("Enter an input file: ")
outpath = input("Enter an output file: ")
with open(inpath, "r") as infile, open("outpath", "w") as outfile:
for line in infile:
outfile.write(line.replace(searchString, "") + "\n")
三,閱讀和處理內存中的整個文件,然後截斷和重寫整個文件:
def main():
path = input("Enter an input/output file: ")
with open(path, "r+") as inoutfile:
lines = [line.replace(searchString, "") for line in inoutfile]
inoutfile.seek(0)
inoutfile.truncate()
inoutfile.writelines(lines)
最後,寫入到一個臨時文件(與第二個選項),然後繼續前進原始輸入文件的頂部該臨時文件。事情是這樣的:
def main():
path = input("Enter an input/output file: ")
with open(path, "r") as infile, tempfile.NamedTemporaryFile("w", delete=False) as outfile:
for line in infile:
outfile.write(line.replace(searchString, ""))
shutil.move(outfile.name, pathname)
這最後一個是有點棘手,因爲POSIX和Windows之間的區別。但是,它有很大的優勢。 (例如,如果你的程序在操作過程中被殺死了,不管它發生了什麼,你可以保證有原始文件或新文件,而不是一些半成文的混亂。)
你必須在讀取模式下打開文件。嘗試'「a +」' – JBernardo
作爲一個方面說明,您有太多名爲'string'的變量。你可能想'string1 = input(...)'然後'string = string.replace(string1,「」)''。最後,您實際上需要將字符串寫回到文件中。替換文件中的字符串有點困難。通常,您使用修改的內容創建一個新文件,然後在一天結束時,將新文件移到舊文件的頂部。 – mgilson
@JBernardo:這是真的,但在這種情況下它並沒有真正的幫助。你不能只是在閱讀文件的過程中寫文件 - 或者,你可以,但是它會在不同的平臺上做不愉快的事情和不同的不愉快的事情。儘管如此,它仍是一個起點 - 它直接解釋了OP的標題提到的錯誤。 – abarnert