2008-08-24 25 views
50

पायथन में आप चरित्र डेटा के लिए फ़ाइल-जैसे बफर के लिए StringIO का उपयोग कर सकते हैं। Memory-mapped file मूल रूप से बाइनरी डेटा के लिए समान चीज करता है, लेकिन इसके लिए एक फ़ाइल की आवश्यकता होती है जिसका आधार आधार के रूप में उपयोग किया जाता है। क्या पाइथन में एक फ़ाइल ऑब्जेक्ट है जिसका उद्देश्य बाइनरी डेटा के लिए है और केवल स्मृति है, जावा के ByteArrayOutputStream के बराबर है?पायथन में बाइनरी बफर

मेरे पास उपयोग-मामला है, मैं स्मृति में एक ज़िप फ़ाइल बनाना चाहता हूं, और ZipFile को फ़ाइल जैसी वस्तु की आवश्यकता होती है।

उत्तर

69

आप शायद io.BytesIO वर्ग के लिए देख रहे हैं दिलचस्पी होगी।

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

StringIO फेंक होगा लेखन त्रुटि::

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

धन्यवाद! मैं लंबे समय से खोज कर रहा हूं और केवल लोगों को स्ट्रिंगियो का जिक्र कर सकता है, लेकिन यह बाइट्सियो बिल्कुल वही है जो मैं ढूंढ रहा हूं। – Chad

+0

यह शीर्ष मूल्यांकन किया गया जवाब होना चाहिए। – Cacovsky

3

संरचना पैकेज को देखें: https://docs.python.org/library/struct.html, यह आपको तारों को पैक किए गए बाइनरी डेटा के रूप में समझने की अनुमति देता है।

सुनिश्चित नहीं है कि यह आपके प्रश्न का पूरी तरह उत्तर देगा लेकिन आप बाइनरी डेटा को पाइथन ऑब्जेक्ट्स में कनवर्ट करने के लिए struct.unpack() का उपयोग कर सकते हैं।

 

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

पूर्णांक इस उदाहरण, ">" बड़े endian "h" पढ़ने के लिए कहता है कम 2-बाइट पढ़ता है, और "l" एक 4-बाइट लंबे समय के लिए है। आप स्पष्ट रूप से जब तक आप अपने StringIO में किसी भी यूनिकोड डेटा डाल करने के लिए कोशिश मत करो के रूप में है और आप का उपयोग करने के प्रति सावधान कर रहे हैं जो कुछ भी आप बाइनरी डेटा से बाहर पढ़ने की जरूरत है के लिए इन बदल सकते हैं ...

+0

आप कुछ इस तरह बनाने के लिए इसका मतलब यह कार्य करें: http://stackoverflow.com/questions/4239666 यह सिवाय यह बाइनरी डेटा का समर्थन करता है कि वास्तव में StringIO तरह काम करता है/getting-bytes-from-unicode-string-in-python – yucer

24

cStringIO आप होना चाहिए ठीक।

StringIO दस्तावेज़ीकरण के अनुसार, जब तक आप या तो यूनिकोड या 8-बिट्स को रखते हैं, वैसे ही सबकुछ अपेक्षित काम करता है। संभवतः, StringIO कुछ खास करता है जब कोई f.write(u"asdf") (जो मेरे ज्ञान के लिए ज़िपफाइल नहीं करता है) करता है। वैसे भी,

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

अपेक्षा के अनुसार काम करता है, और परिणामस्वरूप संग्रह और मूल फ़ाइल में फ़ाइल के बीच कोई अंतर नहीं है।

आप एक विशेष मामले के बारे में पता है, जहां इस दृष्टिकोण काम नहीं करता है, मैं सबसे सुनना के बारे में यह :)

+0

cStringIO यहां क्यों काम नहीं करता है? –

+0

इसे ज्यादातर मामलों में काम करना चाहिए। मुझे याद नहीं आया कि मैंने कुछ साल पहले क्या सोचा था, लेकिन एक कारण यह होगा कि लिखने के लिए इनपुट() विधि दो संस्करणों के बीच थोड़ा अलग (इनपुट के प्रकार के आधार पर) काम करता है, और मैं आंतरिक पर भरोसा नहीं करना चाहता था ज़िपफाइल में व्यवहार। –

संबंधित मुद्दे