tampon binaire en Python

voix
51

En Python , vous pouvez utiliser StringIO pour un tampon de type fichier pour les données de caractère. Fichier mappées en mémoire fait essentiellement chose semblable pour les données binaires, mais il a besoin d' un fichier qui est utilisé comme base. Est -ce que Python a un objet fichier qui est destiné aux données binaires et la mémoire uniquement, équivalent à Java de ByteArrayOutputStream ?

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

Créé 24/08/2008 à 14:37
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
3

Regardez le paquet struct: https://docs.python.org/library/struct.html , il vous permet d'interpréter les chaînes sous forme de données binaires emballés.

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


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

int cet exemple, le « > » dit de lire le big-endian « h », lit 2 octets court, et le « l » est un 4 octets de long. vous pouvez évidemment changer ces à tout ce que vous devez lire des données binaires ...

Créé 24/08/2008 à 14:50
source utilisateur

voix
24

Tant que vous ne tentez pas de mettre des données unicode dans votre StringIOet vous veillez à ne pas utiliser , cStringIOvous devriez être très bien.

Selon la StringIO documentation, aussi longtemps que vous gardez soit unicode ou tout 8 bits fonctionne comme prévu. On peut supposer que , StringIOfait quelque chose de spécial quand quelqu'un fait un f.write(u"asdf")(qui ZipFile ne fait pas, à ma connaissance). En tous 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 exactement comme prévu, et il n'y a pas de différence entre le fichier dans l'archive résultante et le fichier d'origine.

Si vous connaissez un cas particulier où cette approche ne fonctionne pas, je serais plus intéressé à entendre parler :)

Créé 24/08/2008 à 15:52
source utilisateur

voix
71

Vous cherchez probablement io.BytesIO classe. Il 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")
Créé 09/09/2011 à 05:34
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more