Python就地在任意位置写入文件

时间:2015-11-01 00:08:36

标签: python file edit edit-in-place

我正在尝试在python中就地编辑文本文件。它非常大(因此无法将其加载到内存中)。我打算替换我在里面找到的逐字节字符串。

with f as open("filename.txt", "r+b"):
    if f.read(8) == "01234567":
        f.seek(-8, 1)
        f.write("87654321")

然而,当我尝试时,write()操作会添加到文件的末尾:

>>> n.read()
'sdf'
>>> n.read(1)
''
>>> n.seek(0,0)
>>> n.read(1)
's'
>>> n.read(1)
'd'
>>> n.write("sdf")
>>> n.read(1)
''
>>> n.seek(0,0)
>>> n.read()
'sdfsdf'
`

我希望结果为sdsdf

2 个答案:

答案 0 :(得分:1)

当将读写模式流从读取模式切换到写入模式时,原始ANSI / ISO C标准需要搜索操作,反之亦然。此限制仍然存在,例如,n1570包含以下文字:

  

当使用更新模式('+'作为上述模式参数值列表中的第二个或第三个字符)打开文件时,可以在关联的流上执行输入和输出。但是,如果没有对fflush函数或文件定位函数(fseekfsetposrewind)的干预调用,输出不应直接输入,并且除非输入操作遇到文件结束,否则输入不应直接跟随输出而不插入文件定位功能。在某些实现中,打开(或创建)具有更新模式的文本文件可以改为打开(或创建)二进制流。

无论出于何种原因,这个限制已被导入Python, 1 ,即使Python包装器可以自动处理它。

对于它的价值,原始ANSI C限制的原因是许多基于Unix的系统上的低预算实现:它们为每个流保留了一个"当前字节数&# 34;和"当前指针"。如果宏化getcputc操作必须调用底层实现,则当前字节计数为0,这可以检查流是否在更新模式下打开并根据需要进行切换。但是一旦你成功获得了一个字符,计数器就会保留可以继续从底层流中读取的字符数;一旦你成功写了一个字符,计数器就会保存允许添加字符的缓冲区位置数。

这意味着,如果您成功填充了内部缓冲区的getc,但后面跟着putc,那么"写入"来自putc的字符只会覆盖缓冲的数据。如果您有一个成功的putc但后面有一个执行不佳的getc,您会看到缓冲区中的未设置值。

这个问题很容易解决(只需提供单独的输入和输出计数器,其中一个总是为零,并且具有对模式切换实现缓冲区重新填充检查的功能)。

1 需要引用: - )

答案 1 :(得分:0)

您可以查看以下代码的区别:

>>> f = open("file.txt", "r+b")
>>> f.read(1)
's'
>>> f.read(1)
'd'
>>> f.seek(2)
>>> f.write("sdf")
>>> f.seek(0)
>>> f.read()
'sdsdf'

.write的指针最初位于文件的末尾。只有.seek()会改变它的位置,但不会改变.read()。所以你必须在写入字节之前调用.seek()。以下代码效果很好:

500 ReferenceError: localStorage is not defined