为什么在Python中以r+模式打开文件后,使用file.write()会追加内容?

3
假设我有一个文件content.txt,其内容为Ex nihilo nihil fit。我想要将其替换为Ex nihilo nihil est。以下是代码:
with open("content.txt", "r+") as f:
    content = f.read()
    content = content.replace("fit", "est")
    print(content)
    f.write(content)
    f.close()

接下来,文件的内容变为:

Ex nihilo nihil fit
Ex nihilo nihil est

为什么?我唯一需要的是Ex nihilo nihil est。这个代码正确吗?

3个回答

3

r+打开文件并将指针放在第一个字节处。当使用f.read()时,指针会移动到文件的末尾,因此在尝试写入时会从文件末尾开始。要返回开头(以便覆盖原内容),请使用f.seek(0)

with open("text.txt", "r+") as f:
    content = f.read()
    content = content.replace("fit", "est")
    print(content)
    f.seek(0)
    f.truncate(0)
    f.write(content)
    f.close()

你的答案是不正确的,因为它没有将文件调整大小以适应新内容。它只是偶然产生了正确的结果,因为旧内容和新内容长度相同。 - Kurtis Rader
@KurtisRader 我的回答在回答问题方面是正确的。唯一错误的地方是我没有在文件末尾截断文件,以防新大小更小,但我现在已经编辑过了。 - actuallyatiger

2

目前,您正在将修改后的内容附加到文件中。

您需要先清除内容。您可以使用seek和truncate实现。

with open("content.txt", "r+") as f:
    content = f.read()
    content = content.replace("fit", "est")
    print(content)
    f.seek(0)  # move to first byte
    f.truncate()  # delete content
    f.write(content)

使用截断清除文件,您应该使用truncate(0),没有0它只会调整大小到内容,我相信。 - actuallyatiger
truncate() 方法将文件大小调整为给定的字节数。如果未指定大小,则使用当前位置。 - bitflip

2
如果你想在一个 .txt 文件中替换一个字符串,可以尝试以下代码:
with open("content.txt", 'r') as file :
    content = file.read()

content = content.replace('fit', 'est')

with open("content.txt", 'w') as file:
    file.write(content)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接