我有一个名为vegetables
:
carrots
苹果_
黄瓜
我想要做的是在 python 中打开文件,并就地修改它,而不覆盖文件的大部分。具体来说,我想覆盖apples_
with lettuce
,这样该文件将如下所示:
carrots
莴苣
黄瓜
为此,我被告知要使用'r+'
模式。但是,我不知道如何覆盖该行。那可能吗?我熟悉的所有解决方案都涉及缓存整个文件,然后覆盖整个文件,进行小的修改。这真的是最好的选择吗?
重要的提示:替换线的长度始终与原始线的长度相同。
就背景而言:我并不真正关心蔬菜文件。相反,我有一个大约 400 行的文本文件,我需要大约每两分钟对其进行修改。我有一个脚本可以执行此操作,但我想更有效地执行此操作。
适合您的示例的答案
with open("vegetables","r+") as t:
data = t.read()
t.seek(data.index("apples_"))
t.write("lettuce")
虽然,让这样的事情复杂化可能不值得,
只需读取整个文件,然后覆盖整个文件就可以了,通过执行像我的示例这样的操作不会节省太多
注意:只有当它的长度与您要替换的原始文本完全相同时,这才有效
edit1:替换所有匹配的(可能是坏的)示例:
import re
with open("test","r+") as t:
data = t.read()
for m in re.finditer("apples_", data):
t.seek(m.start())
t.write("lettuce")
edit2:使用闭包做一些更复杂的事情,以便它可以检查要替换的多个单词
import re
def get_find_and_replace(f):
"""f --> a file that is open with r+ mode"""
data = f.read()
def find_and_replace(old, new):
for m in re.finditer(old, data):
f.seek(m.start())
f.write(new)
return find_and_replace
with open("test","r+") as f:
find_and_replace = get_find_and_replace(f)
find_and_replace("apples_","lettuce")
#find_and_replace(...,...)
#find_and_replace(...,...)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)