i = iter(lambda: stringio.read(1),'Z')
buf = ''.join(i) + 'Z'
ここでiterは、このモードで使用されます: iter(callable, sentinel) -> iterator.
''.join(...)かなり効果的です。「Z」を追加する最後の操作''.join(i) + 'Z'はあまり良くありません。ただし'Z'、イテレータに追加することで対処できます。
from itertools import chain, repeat
stringio = StringIO.StringIO('ABCZ123')
i = iter(lambda: stringio.read(1),'Z')
i = chain(i,repeat('Z',1))
buf = ''.join(i)
それを行うもう 1 つの方法は、ジェネレーターを使用することです。
def take_until_included(stringio):
while True:
s = stringio.read(1)
yield s
if s=='Z':
return
i = take_until_included(stringio)
buf = ''.join(i)
いくつかの効率テストを行いました。説明されている手法のパフォーマンスはほとんど同じです。
http://ideone.com/dQGe5