StringIO中的就地替换

时间:2016-11-27 09:08:15

标签: python python-2.7 python-internals stringio cstringio

如何在@+id/...内用另一个字符串替换字符串? - 如果他们的长度相同,我已经听说过了。

尝试:

@id/...

PS:目前正在研究C语言的解决方案,但更愿意让它发挥作用。

1 个答案:

答案 0 :(得分:4)

StringIO尝试在读/写中模拟常规文件,但它存储在内存中。尝试使用常规文件而不是使用常规文件编辑文本文件时遇到相同的问题(替换为更长的字符串会覆盖以下行)。你也有相同的选择。

小的其他更改:在开始时使用默认字符串创建的cStringIO不可写。但你可以通过创建一个空对象并写入它来解决这个问题(你现在显然可以访问write方法了)

您在寻找什么:

c = 'can\nhaz\nfoo'

sio = StringIO()
sio.write(c)
sio.seek(0)

offset = sio.tell()
for line in sio:
    if line == 'haz\n':
        sio.seek(offset)
        sio.write('bar\n')
        break
    offset = sio.tell()

它存储线程之前的偏移,如果找到模式,它会回寻到前一个偏移量,并写入相同的字节数

残酷的解决方案,如果你想使用cStringIO:你可以完全读取缓冲区,执行替换,然后回写它(允许用更长的字符串替换),但是读取整个缓冲区,这可能不是你想要什么:

c = 'can\nhaz\nfoo'

sio = StringIO(c)

v = sio.getvalue()
v = v.replace("haz","bar")
sio.seek(0)
sio.write(v)

请注意,Python 3删除了这些对象,现在它只是io。因此,依赖此类或此类实现将使您的代码不可移植。