Подтвердить что ты не робот

Бинарный буфер в Python

В Python вы можете использовать StringIO для файлового буфера для символьных данных. Файл с отображением памяти в основном делает аналогичную вещь для двоичных данных, но для этого нужен файл, который используется в качестве основы. У Python есть объект файла, который предназначен для двоичных данных и является только памятью, эквивалентной Java ByteArrayOutputStream?

В моем случае я хочу создать ZIP файл в памяти, а ZipFile требует файл-подобный объект.

4b9b3361

Ответ 1

Возможно, вы ищете класс io.BytesIO. Он работает точно так же, как StringIO, за исключением того, что он поддерживает двоичные данные:

from io import BytesIO
bio = BytesIO(b"some initial binary data: \x00\x01")

StringIO будет бросать TypeError:

from io import StringIO
sio = StringIO(b"some initial binary data: \x00\x01")

Ответ 2

Пока вы не пытаетесь поместить какие-либо данные в unicode в свой StringIO, и вы не должны использовать cStringIO, вы должны быть в порядке.

В соответствии с документацией StringIO до тех пор, пока вы держитесь либо в unicode, либо в 8 бит, все работает так, как ожидалось. Предположительно, StringIO делает что-то особенное, когда кто-то делает f.write(u"asdf") (что ZipFile не делает, насколько мне известно). Во всяком случае,

import zipfile
import StringIO

s = StringIO.StringIO()
z = zipfile.ZipFile(s, "w")
z.write("test.txt")
z.close()
f = file("x.zip", "w")
f.write(s.getvalue())
s.close()
f.close()

работает так, как ожидалось, и нет никакой разницы между файлом в результирующем архиве и исходным файлом.

Если вы знаете конкретный случай, когда этот подход не работает, мне было бы очень интересно услышать об этом:)

Ответ 3

Посмотрите на пакет struct: https://docs.python.org/library/struct.html, он позволяет интерпретировать строки как упакованные двоичные данные.

Не уверен, что это полностью ответит на ваш вопрос, но вы можете использовать struct.unpack() для преобразования двоичных данных в объекты python.


import struct
f = open(filename, "rb")
s = f.read(8)
x, y = struct.unpack(">hl", s)

int в этом примере, " > " говорит, чтобы прочитать "большой", "h" читает 2-байтовый короткий, а "l" - 4-байтовый. вы можете, очевидно, изменить их на все, что вам нужно для чтения из двоичных данных...