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

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

В качестве эксперимента я попытался записать в 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. Что мне не хватает?


person twasbrillig    schedule 12.11.2014    source источник


Ответы (2)


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

myio.seek(0)
person mgilson    schedule 12.11.2014
comment
Буферы, заполненные matplotlib savefig (), также нуждаются в этом, прежде чем они могут быть отправлены сервером приложений. Спасибо, что закончили многочасовые исследования! - person TomTom101; 08.01.2017
comment
Или используйте getvalue(). Эти мелочи разбросаны повсюду! - person theaws.blog; 21.08.2020
comment
getvalue () у меня не работал, кроме seek (0) - person caot; 09.01.2021

Как насчет того, чтобы писать и читать содержимое gzip в таком же контексте, как этот?

#!/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)
    gzipped_content = myio.getvalue()

print(gzipped_content)
print(content == gzip.decompress(gzipped_content))
person Gatsby Lee    schedule 26.06.2019
comment
Я не думаю, что g.close() здесь нужен, верно? - person juan; 12.04.2021
comment
@juan, ты прав. поскольку он находится в контексте, g.close () не требуется. Я удалил это. Спасибо. - person Gatsby Lee; 13.04.2021