2011-11-23 11 views
6

मैंने कहीं से bytearray से डेटा का बफर पढ़ा। अब, मैं धारा की तरह इंटरफ़ेस का उपयोग कर इस डेटा के साथ काम करना चाहते हैं (अर्थात read, seek आदि)पायथन 3 - गैर-प्रतिलिपि स्ट्रीम इंटरफ़ेस bytearray?

मैं बस अपना bytearrayio.BytesIO के साथ रैप कर सकते हैं? यहाँ

mybytearray = bytearray(...) 
stream = io.BytesIO(mybytearray) 

मुझे डर है mybytearray की BytesIO प्रतियां डेटा है, लेकिन मैं इसे नहीं चाहते हैं - के बाद से बफर बहुत बड़ा है। मैं प्रतियां नहीं चाहता, मैं चाहता हूं कि स्ट्रीम मूल डेटा पर काम करे और इसे भी संशोधित कर सके। क्या किया जा सकता है?

उत्तर

8

BytesIO अपनी याददाश्त प्रबंधित करता है और इसे आरंभ करने के लिए उपयोग किए गए बफर की प्रतिलिपि बनायेगा। आप फ़ाइल की तरह कक्षा में अपने bytearray को समाहित कर सकते हैं। या आप BytesIO ऑब्जेक्ट मेमोरी मेमोरी आवंटन को देकर, दूसरी तरफ जा सकते हैं। तो फिर तुम जबकि दृश्य मौजूद है बफर कि सूचकांक और टुकड़ा द्वारा संशोधित किया जा सकता का एक दृश्य आकार फिर से बफर प्राप्त कर सकते हैं, लेकिन आप नहीं कर सकते हैं:

>>> f = io.BytesIO(b'abc') 
>>> view = f.getbuffer() 

>>> view[:] = b'def' 
>>> f.getvalue() 
b'def' 

>>> view[3] = b'g' 
IndexError: index out of bounds 

>>> f.seek(0, 2) 
>>> f.write(b'g') 
BufferError: Existing exports of data: object cannot be re-sized 

>>> del view 
>>> f.write(b'g') 
>>> f.getvalue() 
b'defg' 

संपादित करें:

देखें issue 22003, BytesIO कॉपी-ऑन-राइट। नवीनतम पैच (cow6) केवल bytes के लिए कॉपी-ऑन-राइट का समर्थन करता है।

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