Δυαδική ρυθμιστικό σε Python

ψήφοι
51

Στην Python, μπορείτε να χρησιμοποιήσετε StringIO για ένα αρχείο, όπως το ρυθμιστικό για τα δεδομένα του χαρακτήρα. Αρχείο μνήμης χαρτογραφηθεί ουσιαστικά κάνει κάτι παρόμοιο για δυαδικά δεδομένα, αλλά απαιτεί ένα αρχείο που χρησιμοποιείται ως βάση. Μήπως Python έχει ένα αντικείμενο αρχείο που προορίζεται για δυαδικά δεδομένα και είναι μόνο μνήμη, ισοδύναμη με της Java ByteArrayOutputStream ;

Η χρήση περίπτωση που έχω είναι ότι θέλετε να δημιουργήσετε ένα αρχείο ZIP στη μνήμη, και zipfile απαιτεί ένα αντικείμενο αρχείου, όπως.

Δημοσιεύθηκε 24/08/2008 στις 16:37
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
3

Κοιτάξτε το πακέτο 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)

int αυτό το παράδειγμα, το «>» λέει να διαβάζουν μεγάλα endian το «h» διαβάζει ένα 2-byte μικρή, και το «λ» είναι για μεγάλο χρονικό 4-byte. προφανώς να αλλάξετε αυτές σε ό, τι χρειάζεστε για να διαβάσετε έξω από το δυαδικών δεδομένων ...

Απαντήθηκε 24/08/2008 στις 16:50
πηγή χρήστη

ψήφοι
24

Εφ 'όσον δεν προσπαθείτε να βάλετε οποιαδήποτε Unicode δεδομένων σε σας StringIOκαι να είστε προσεκτικοί να ΜΗΝ χρησιμοποιείτε cStringIOθα πρέπει να είναι μια χαρά.

Σύμφωνα με την StringIO τεκμηρίωση, εφ 'όσον κρατάτε είτε unicode ή 8-bits όλα λειτουργούν όπως αναμένεται. Προφανώς, 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/08/2008 στις 17:52
πηγή χρήστη

ψήφοι
71

Είστε πιθανόν να ψάχνει για 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")
Απαντήθηκε 09/09/2011 στις 07:34
πηγή χρήστη

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