Я очень разочарован тем, что на этот вопрос получают только один ответ на переполнение стека, потому что это интересный и актуальный вопрос. Во всяком случае, так как только oggolovin дают решение, и я подумал, что это может быть медленно, я подумал, более быстрое решение:
def foo(stringio):
datalist = []
while True:
chunk = stringio.read(256)
i = chunk.find('Z')
if i == -1:
datalist.append(chunk)
else:
datalist.append(chunk[:i+1])
break
if len(chunk) < 256:
break
return ''.join(datalist)
Это читается в виде фрагментов (возможно, конец символа найден не в первом фрагменте). Это очень быстро, потому что ни одна функция Python не вызывается для каждого символа, а наоборот - максимальное использование написанных на C функций Python.
Этот прогон примерно в 60 раз быстрее, чем раствор Овголовина. Я пробежал timeit
, чтобы проверить его.