BytesIO
ведет себя как файл, только тот, который вы можете читать и писать.Может быть, запутанная часть в том, что позиция чтения и письма одинакова.Итак, сначала вы делаете:
in_memory = io.BytesIO(b'hello')
Это дает вам буфер байтов в in_memory
с содержимым b'hello'
и с позицией чтения / записи в начале (перед первым b'h'
).Когда вы делаете:
in_memory.write(b' world')
Вы фактически перезаписываете b'hello'
с помощью b' world'
(и фактически получаете еще один байт), и теперь у вас есть позиция в конце (после последнего b'd'
),Поэтому, когда вы делаете:
print( in_memory.read() )
Вы ничего не видите, потому что нечего читать после текущей позиции.Однако вы можете использовать seek
для перемещения позиции, поэтому если вы сделаете
import io
in_memory = io.BytesIO(b'hello')
in_memory.write(b' world')
in_memory.seek(0)
print( in_memory.read() )
Вы получите:
b' world'
Обратите внимание, что вы не делаетесм. начальный b'hello'
, потому что он был перезаписан.Если вы хотите написать после исходного содержимого, вы можете сначала выполнить поиск до конца:
import io
in_memory = io.BytesIO(b'hello')
in_memory.seek(0, 2)
in_memory.write(b' world')
in_memory.seek(0)
print( in_memory.read() )
Вывод:
b'hello world'
РЕДАКТИРОВАТЬ: О getvalue
, как указано в других ответах, он дает вам полный внутренний буфер, независимо от текущей позиции.Эта операция явно недоступна для файлов.