在进入细节之前有几点说明:当你调用 时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”模式打开文件,这意味着“只写,追加到末尾”。如果要读写,可以使用“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 之间的差异,最后一个有点棘手。但是,它有一些很大的优势。(例如,如果您的程序在运行过程中被杀死,无论它是如何发生的,都保证您拥有原始文件或新文件,而不是一些写一半的混乱。)