Двоичный буфер в Python



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

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

82   3  

3 ответов:

Вы, наверное, ищите 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")

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

по словам StringIO документация, пока вы придерживаетесь Юникода или 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()

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

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

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

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


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

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

    Ничего не найдено.

Добавить ответ:
Отменить.