StringI就地更换

2024-10-01 11:29:09 发布

您现在位置:Python中文网/ 问答频道 /正文

如何用StringIO中的另一个字符串替换一个字符串?-我听说如果长度相同的话是有可能的。在

尝试:

from cStringIO import StringIO

c = 'can\nhaz\nfoo'

sio = StringIO(c)

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

sio.seek(0)
sio.readlines()   # [ 'can\n', 'haz\n', 'bar' ]

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


Tags: 字符串infromimportforiflinebar
1条回答
网友
1楼 · 发布于 2024-10-01 11:29:09

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()

它在lineread之前存储偏移量,如果找到模式,它将返回到上一个偏移量,并写入相同数量的字节

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

^{pr2}$

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

相关问题 更多 >