Запись и чтение байтов в памяти (BytesIO) дает пустой результат

Я хотел попробовать класс Python BytesIO.

В качестве эксперимента я попытался записать в память zip-файл, а затем прочитать байты из этого zip-файла. Поэтому вместо передачи файла-объекта gzipПрохожу в BytesIO объект. Вот весь сценарий:

from io import BytesIO
import gzip

# write bytes to zip file in memory
myio = BytesIO()
g = gzip.GzipFile(fileobj=myio, mode='wb')
g.write(b"does it work")
g.close()

# read bytes from zip file in memory
g = gzip.GzipFile(fileobj=myio, mode='rb')
result = g.read()
g.close()

print(result)

Но возвращается пустой bytes объект для result, Это происходит как в Python 2.7, так и в 3.4. Что мне не хватает?

3 ответа

Решение

Вам нужно seek вернуться к началу файла после записи исходного файла в память...

myio.seek(0)

Как насчет того, чтобы написать и прочитать содержимое gzip в том же контексте, как это? Если этот подход хорош и работает для всех, кто читает это, пожалуйста, +1 за этот ответ, чтобы я знал этот подход правильно и работал для других людей?

#!/usr/bin/env python

from io import BytesIO
import gzip

content = b"does it work"

# write bytes to zip file in memory
gzipped_content = None
with BytesIO() as myio:
    with gzip.GzipFile(fileobj=myio, mode='wb') as g:
        g.write(content)
        g.close()
    gzipped_content = myio.getvalue()

print(gzipped_content)
print(content == gzip.decompress(gzipped_content))

myio.getvalue()является альтернативойseekкоторый возвращает байты, содержащие все содержимое буфера (docs).

Это сработало для меня после того, как столкнулся с аналогичной проблемой.

Другие вопросы по тегам