2

假设我有一个文件 /etc/conf1

它的内容是

option = banana
name = monkey
operation = eat

假设我想用“鸵鸟”替换“猴子”。如果不将文件读入内存,更改它然后将其全部写回,我怎么能做到这一点?基本上,我怎样才能“就地”修改文件?

4

6 回答 6

2

你不能。“ostrich”比“monkey”多一个字母,所以至少从那时起你必须重写文件。文件系统不支持向上或向下“移动”文件内容。

如果它只是一个小文件,甚至没有理由为此烦恼,您还不如重写整个文件。

如果它是一个非常大的文件,您将需要重新考虑文件内容的内部设计,例如,使用基于块的方法。

于 2010-07-05T08:49:55.517 回答
1

你应该看看 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 以免在其中添加任何额外的换行符。

于 2010-07-05T08:48:24.240 回答
0

sed -i.bak '/monkey$/newword/' file

于 2010-07-05T10:11:41.717 回答
0

仅当您不更改文件大小或仅附加到文件时,就地修改才容易。以下示例将文件的第一个字节替换为“a”字符:

fd = os.open("...", os.O_WRONLY | os.O_CREAT)
os.write(fd, "a")
os.close(fd)

请注意,Python 的file对象不支持这一点,您必须使用低级函数。open()对于追加,使用模式中的功能打开文件文件"a"

于 2010-07-05T08:59:01.487 回答
0

这取决于您所说的“就地”是什么意思。如果要替换monkeysupercalifragilisticexpialidocious怎么办?是否要覆盖剩余的文件?如果没有,您将不得不提前阅读并将文件的后续内容向前移动。

于 2010-07-05T08:51:48.853 回答
0

CPU 指令对来自内存的数据进行操作。

您希望读取的文件部分必须先驻留在内存中,然后才能读取它;在将任何内容写入磁盘之前,该信息必须在内存中。

整个文件不必同时存在但要对整个文件进行搜索替换,文件的每个字符都会在某个时候通过 RAM。

您可能正在寻找类似 mmap() 系统调用的东西。上面的 fileinput 模块听起来像是一个合理的使用方法。

于 2010-07-05T08:52:05.053 回答