假设我有一个文件 /etc/conf1
它的内容是
option = banana
name = monkey
operation = eat
假设我想用“鸵鸟”替换“猴子”。如果不将文件读入内存,更改它然后将其全部写回,我怎么能做到这一点?基本上,我怎样才能“就地”修改文件?
假设我有一个文件 /etc/conf1
它的内容是
option = banana
name = monkey
operation = eat
假设我想用“鸵鸟”替换“猴子”。如果不将文件读入内存,更改它然后将其全部写回,我怎么能做到这一点?基本上,我怎样才能“就地”修改文件?
你不能。“ostrich”比“monkey”多一个字母,所以至少从那时起你必须重写文件。文件系统不支持向上或向下“移动”文件内容。
如果它只是一个小文件,甚至没有理由为此烦恼,您还不如重写整个文件。
如果它是一个非常大的文件,您将需要重新考虑文件内容的内部设计,例如,使用基于块的方法。
你应该看看 fileinput 模块:
http://docs.python.org/library/fileinput.html
有一个选项可以通过输入法执行就地编辑:
http://docs.python.org/library/fileinput.html#fileinput.input
更新 - 示例代码:
import fileinput
import re
import sys
for line in fileinput.input(inplace=True):
sys.stdout.write(re.sub(r'monkey', 'ostrich', line))
使用 sys.stdout.write 以免在其中添加任何额外的换行符。
sed -i.bak '/monkey$/newword/' file
仅当您不更改文件大小或仅附加到文件时,就地修改才容易。以下示例将文件的第一个字节替换为“a”字符:
fd = os.open("...", os.O_WRONLY | os.O_CREAT)
os.write(fd, "a")
os.close(fd)
请注意,Python 的file
对象不支持这一点,您必须使用低级函数。open()
对于追加,使用模式中的功能打开文件文件"a"
。
这取决于您所说的“就地”是什么意思。如果要替换monkey
为supercalifragilisticexpialidocious
怎么办?是否要覆盖剩余的文件?如果没有,您将不得不提前阅读并将文件的后续内容向前移动。
CPU 指令对来自内存的数据进行操作。
您希望读取的文件部分必须先驻留在内存中,然后才能读取它;在将任何内容写入磁盘之前,该信息必须在内存中。
整个文件不必同时存在,但要对整个文件进行搜索替换,文件的每个字符都会在某个时候通过 RAM。
您可能正在寻找类似 mmap() 系统调用的东西。上面的 fileinput 模块听起来像是一个合理的使用方法。