Question

En Python, vous pouvez utiliser ChaîneIO pour un tampon de type fichier pour les données de caractères. Fichier mappé en mémoire fait essentiellement la même chose pour les données binaires, mais cela nécessite un fichier qui sert de base.Python a-t-il un objet fichier destiné aux données binaires et constitué uniquement de mémoire, équivalent à celui de Java ? ByteArrayOutputStream?

Le cas d'utilisation que j'ai est que je souhaite créer un fichier ZIP en mémoire, et Fichier zip nécessite un objet de type fichier.

Était-ce utile?

La solution

Vous recherchez probablement io.OctetsIO classe.Cela fonctionne exactement comme StringIO sauf qu'il prend en charge les données binaires :

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

StringIO lancera TypeError :

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

Autres conseils

Tant que vous n'essayez pas de mettre des données Unicode dans votre StringIO et vous faites attention à NE PAS utiliser cStringIO ça devrait aller.

Selon le ChaîneIO documentation, tant que vous respectez l'Unicode ou le 8 bits, tout fonctionne comme prévu.Probablement, StringIO fait quelque chose de spécial quand quelqu'un fait un f.write(u"asdf") (ce que ZipFile ne fait pas, à ma connaissance).De toute façon;

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()

fonctionne comme prévu et il n'y a aucune différence entre le fichier de l'archive résultante et le fichier d'origine.

Si vous connaissez un cas particulier où cette approche ne fonctionne pas, je serais très intéressé d'en entendre parler :)

Regardez le package struct : https://docs.python.org/library/struct.html, il vous permet d'interpréter des chaînes comme des données binaires compressées.

Je ne sais pas si cela répondra complètement à votre question, mais vous pouvez utiliser struct.unpack() pour convertir des données binaires en objets python.


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

Dans cet exemple, le ">" indique de lire le big-endian, le "h" lit un court de 2 octets et le "l" correspond à un long de 4 octets.vous pouvez évidemment les remplacer par tout ce dont vous avez besoin pour lire les données binaires...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top