Двоичный буфер в Python
в Python вы можете использовать StringIO файл-как буфер для данных персонажей. памяти файл в основном делает то же самое для двоичных данных, но она требует файл, который используется в качестве основы. Есть ли у Python объект file, который предназначен для двоичных данных и является только памятью, эквивалентной Java ByteArrayOutputStream?
прецедент у меня есть, я хочу создать ZIP-файл в памяти, и ZipFile требует файлоподобный объект.
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-байтового длинного. очевидно, вы можете изменить их на все, что вам нужно считывание двоичных данных...
Comments