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

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

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

24.08.2008 15:37:50
3 ОТВЕТА
РЕШЕНИЕ

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

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

StringIO выдаст ошибку типа:

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

Посмотрите на пакет 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)

В этом примере «>» указывает на чтение с прямым порядком байтов, «h» - на 2-байтовое сокращение, а «l» - на 4-байтовое. очевидно, вы можете изменить их на все, что вам нужно прочитать из двоичных данных ...

3
2.11.2014 02:33:18
Вы хотите сделать что-то вроде этого: stackoverflow.com/questions/4239666/…
yucer 27.12.2016 11:18:59

До тех пор, пока вы не пытаетесь поместить какие-либо данные в кодировке 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()

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

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

24
2.11.2014 03:37:41
Это должно работать в большинстве случаев. Я не могу вспомнить, что я думал около 3 лет назад, но одной из причин будет то, что вход для метода write () работает немного по-разному (в зависимости от типа ввода) между двумя версиями, и я не хотел полагаться на внутренний поведение в zipfile.
Henrik Gustafsson 11.05.2011 20:46:21