Python İkili tampon

oy
51

Python size kullanabilirsiniz StringIO karakter verileri için bir dosya benzeri tampon için. Bellek eşlemeli dosya temelde ikili veri için benzer şeyi yapar, ancak temel olarak kullanılan bir dosyası gerektirir. Python Java'nın eşdeğer ikili veriler için kullanılabilir ve hafıza sadece bir dosya nesnesi, var mı ByteArrayOutputStream ?

Ben kullanım-case ben bellekte bir ZIP dosyası oluşturmak istiyorum, ve ZipFile bir dosya benzeri bir nesne gerektirir.

Oluştur 24/08/2008 saat 16:37
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
3

Yapı paketine bak: https://docs.python.org/library/struct.html , bu paketlenmiş ikili veri olarak dizeleri yorumlamak için izin verir.

Emin değilim bu tamamen sorunuza cevap olacak ama piton nesnelere ikili veri dönüştürmek için struct.unpack () kullanabilirsiniz eğer.


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

Bu örneği int ">" "h" big-endian okumak söyler 2 baytlık kısa okur ve "l" 4-byte içindir. belli ki ikili veri okumak için ne gerekiyorsa bu değiştirebilir ...

Cevap 24/08/2008 saat 16:50
kaynak kullanıcı

oy
24

Sürece aşağıdaki konularda herhangi unicode veri koymak etmeye kalkma olarak StringIOve kullanmak DEĞİL dikkatli cStringIOince olmalıdır sizi.

Göre StringIO dokümantasyon, sürece unicode veya 8-bit her şey ya beklenen işleri için tutmak gibi. Muhtemelen, StringIObirileri yaptığında özel bir şey yapan bir f.write(u"asdf")(ZipFile yapmaz ki, bildiğim kadarıyla). Neyse;

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

beklendiği gibi çalışıyor ve ortaya çıkan arşivde dosya ve orijinal dosya arasında hiçbir fark yoktur.

Eğer bu yaklaşım çalışmadığı durumlarda, belirli bir davanın biliyorsanız, bu konuda duymak en çok ilgi duyarım :)

Cevap 24/08/2008 saat 17:52
kaynak kullanıcı

oy
71

Muhtemelen aradığınız io.BytesIO sınıfında. O ikili veri destekler dışında aynen StringIO gibi çalışır:

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

StringIO TypeError atacağım:

from io import StringIO
sio = StringIO(b"some initial binary data: \x00\x01")
Cevap 09/09/2011 saat 07:34
kaynak kullanıcı

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