如何更改文件并只将更改写入磁盘-基本上是sed(python)?

如何更改文件并只将更改写入磁盘-基本上是sed(python)?,python,file,sed,fopen,file-manipulation,Python,File,Sed,Fopen,File Manipulation,假设我有一个文件/etc/conf1 它的内容是按照 option = banana name = monkey operation = eat 假设我想用“鸵鸟”来代替“猴子”。如果不将文件读入内存,修改它,然后将其全部写回,我怎么能做到这一点呢?基本上,如何“就地”修改文件?您应该查看文件输入模块: 有一个通过输入法执行就地编辑的选项: 更新-示例代码: import fileinput import re import sys for line in fileinput.inpu

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

它的内容是按照

option = banana
name = monkey
operation = eat

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

您应该查看文件输入模块:

有一个通过输入法执行就地编辑的选项:

更新-示例代码:


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以避免在中添加任何额外的换行符。

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

如果它只是一个小文件,就没有理由为此而烦恼,你也可以重写整个文件


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

这取决于您所说的“就地”是什么意思。如果你想用
supercalifragilisticexpialidious
替换
monkey
,你该怎么做?是否要覆盖剩余的文件?否则,您将不得不提前读取并向前移动文件的后续内容。

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

要读取的文件部分必须先驻留在内存中,然后才能读取;在将任何内容写入磁盘之前,这些信息必须在内存中

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


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

只有在不改变文件大小或只附加文件的情况下,就地修改才很容易。以下示例将文件的第一个字节替换为“a”字符:

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

请注意,Python的
文件
对象不支持这一点,您必须使用低级函数。要进行追加,请在
“a”
模式下使用
open()
函数打开文件。

sed-i.bak'/monkey$/newword/'文件

。您认为通过修改“就地”可以实现什么?这是一个大文件,你担心把它保存在内存中吗?如果你想改变文件大小,我想你不能。另外,
sed
无法做到这一点,当前的操作系统根本不支持它。另一种选择是,您可以查看用于解析INI样式配置文件的
ConfigParser
模块。在当前情况下,它更多地是一个假设性的问题:“我读取、修改、写入文件的机会有多大,中途出现问题并最终导致文件损坏?”问题。我曾考虑过一种“读取conf1,修改,写入conf1.temp,mv conf1.temp conf1”的方法,但我认为有一种更优雅的方法可以做到这一点。就地mod会很酷。试过了,没法让它工作。fileinput的存在是我提出这个问题的原因。你能详细说明或提供一个例子吗?我现在添加了一些例子代码。注意,从技术上讲,它确实会将文件读入内存(一次一行),但这与sed的操作方式是相同的。关键的是,即使你没有改变它,你也必须输出行。这是困扰我一段时间的事情,我永远都不知道怎么做。我只是觉得我不擅长处理文件。实际上,我曾经在python中实现过“read block,modify,write block”方法,有人告诉我这样做很愚蠢,因为当您使用f.read()时,系统实际上一次只加载几个块。。。是的,它是一个大文件(100MB大)。我想,在资源方面,转换比直接编写一个新文件要昂贵得多?如果你只是解析直到达到你想要的配置选项,你只会在最坏的情况下读取整个文件。我的问题与文件内容的转移有关,我想。。。。。。在python中,没有sed、subprocess、os.system等:D
fp=open(“…”,“r+b”);fp.写入(“a”);fp.close()
现在,当你说“Python的
文件
对象不支持这个”时,我是否误解了你的意思?