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