57 votes

Tampon binaire en Python

En Python, vous pouvez utiliser StringIO pour un tampon de type fichier pour les données de caractères. Fichier à mémoire partagée fait essentiellement la même chose pour les données binaires, mais il faut un fichier qui sert de base. Python dispose-t-il d'un objet fichier destiné aux données binaires et uniquement en mémoire, équivalent à l'objet Java Tableau d'octets de sortie (ByteArrayOutputStream) ?

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

80voto

akhan Points 677

Vous êtes probablement à la recherche de io.BytesIO la classe. Elle fonctionne exactement comme StringIO sauf qu'elle supporte les données binaires :

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

StringIO déclenchera TypeError :

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

24voto

Henrik Gustafsson Points 11755

Tant que vous n'essayez pas de mettre des données unicode dans votre fichier StringIO et vous faites attention à ne PAS utiliser cStringIO vous devriez vous en sortir.

Selon le StringIO tant que vous vous en tenez à l'unicode ou aux 8 bits, tout fonctionne comme prévu. Vraisemblablement, StringIO fait quelque chose de spécial quand quelqu'un fait un f.write(u"asdf") (ce que ZipFile ne fait pas, à ma connaissance). En tout cas ;

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é de l'entendre :)

3voto

mmattax Points 10865

Regardez le paquet de structures : http://docs.python.org/lib/module-struct.html Il vous permet d'interpréter les chaînes de caractères comme des données binaires emballé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 en big-endian, le "h" lit un short de 2 octets, et le "l" est pour un long de 4 octets. vous pouvez évidemment les changer pour ce que vous voulez lire des données binaires...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X