StringIO 中的就地替换
in-place replacement in StringIO
如何用 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 中的解决方案,但更愿意让它工作。
StringIO
尝试模拟 read/write 中的常规文件,只是它存储在内存中。尝试就地编辑文本文件时遇到与使用常规文件相同的问题(用更长的字符串替换会覆盖以下行)。您也有相同的选择。
其他小改动: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()
它存储偏移量 before lineread,如果找到模式,它会返回到以前的偏移量,并写入相同数量的字节
如果你想使用 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
。因此,依赖这样或那样的实现将使您的代码不可移植。
如何用 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 中的解决方案,但更愿意让它工作。
StringIO
尝试模拟 read/write 中的常规文件,只是它存储在内存中。尝试就地编辑文本文件时遇到与使用常规文件相同的问题(用更长的字符串替换会覆盖以下行)。您也有相同的选择。
其他小改动: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()
它存储偏移量 before lineread,如果找到模式,它会返回到以前的偏移量,并写入相同数量的字节
如果你想使用 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
。因此,依赖这样或那样的实现将使您的代码不可移植。