2011-06-25 19 views
49

क्या पाइथन StringIO कक्षा के लिए कोई प्रतिस्थापन है, जो स्ट्रिंग के बजाय bytes के साथ काम करेगा?पायथन स्ट्रिंगियो प्रतिस्थापन जो तारों के बजाए बाइट्स के साथ काम करता है?

यह स्पष्ट नहीं हो सकता है लेकिन यदि आपने बाइनरी डेटा संसाधित करने के लिए स्ट्रिंगियो का उपयोग किया है तो आप पाइथन 2.7 या नए के साथ भाग्य से बाहर हैं।

+1

यह स्पष्ट नहीं है कि आपकी समस्या क्या है। 2.6 में काम करने वाले कोड को दिखाकर अपनी कथित समस्या का प्रदर्शन करें, लेकिन 2.7 में नहीं। या मेरा जवाब देखें। –

+0

लेखक ने अभी तक एक सही उत्तर नहीं चुना है! – heltonbiker

उत्तर

78

io.BytesIO आज़माएं।

रूप othershave ने कहा, आप वास्तव में 2.7 में StringIO उपयोग कर सकते हैं, लेकिन BytesIO आगे की अनुकूलता के लिए एक अच्छा विकल्प है।

+0

यह वहां है: http://docs.python.org/release/2.7.2/library/io.html#io.BytesIO – matchew

+0

हां यह पायथन 3.3 के साथ काम करता है –

7

पायथन 2.6/2.7 में, io मॉड्यूल का उद्देश्य पायथन 3.X के साथ संगतता के लिए उपयोग किया जाना है। दस्तावेज़ों से:

संस्करण 2.6 में नया।

आईओ मॉड्यूल हैंडलिंग स्ट्रीम करने के लिए पायथन इंटरफेस प्रदान करता है। पायथन 2.x के तहत, यह के रूप में प्रस्तावित ऑब्जेक्ट के विकल्प के रूप में प्रस्तावित है, लेकिन पायथन 3.x में यह फ़ाइलों और स्ट्रीम तक पहुंचने के लिए डिफ़ॉल्ट इंटरफ़ेस है।

नोट के बाद से इस मॉड्यूल अजगर 3.x के लिए मुख्य रूप से डिजाइन किया गया है, आप जानते हैं कि इस दस्तावेज में की "बाइट" सभी उपयोगों str प्रकार का उल्लेख (जिनमें से बाइट्स एक उपनाम है) होना जरूरी , और "टेक्स्ट" के सभी उपयोग यूनिकोड प्रकार का संदर्भ लें। इसके अलावा, उन दो प्रकार आईओआई एपीआई में विनिमेय नहीं हैं।

अजगर संस्करणों में पहले 3.X से StringIO मॉड्यूल जो io.StringIO विपरीत अजगर के पूर्व 2.6 संस्करणों में इस्तेमाल किया जा सकता StringIO, की विरासत संस्करण शामिल हैं:

>>> import StringIO 
>>> s=StringIO.StringIO() 
>>> s.write('hello') 
>>> s.getvalue() 
'hello' 
>>> import io 
>>> s=io.StringIO() 
>>> s.write('hello') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: string argument expected, got 'str' 
>>> s.write(u'hello') 
5L 
>>> s.getvalue() 
u'hello' 
6

आप कहते हैं: "यह स्पष्ट नहीं हो सकता है लेकिन यदि आपने बाइनरी डेटा को संसाधित करने के लिए स्ट्रिंगियो का उपयोग किया है तो आप पाइथन 2.7 या नए के साथ भाग्य से बाहर हैं "।

यह स्पष्ट नहीं है क्योंकि यह सच नहीं है।

यदि आपके पास 2.6 या इससे पहले के कोड पर काम है, तो यह 2.7 पर काम करना जारी रखता है। असंपादित स्क्रीन डंप (col 80 पर विंडोज कमांड प्रॉम्प्ट विंडो रैपिंग और सभी):

C:\Users\John>\python26\python -c"import sys,StringIO;s=StringIO.StringIO();s.wr 
ite('hello\n');print repr(s.getvalue()), sys.version" 
'hello\n' 2.6.6 (r266:84297, Aug 24 2010, 18:46:32) [MSC v.1500 32 bit (Intel)] 

C:\Users\John>\python27\python -c"import sys,StringIO;s=StringIO.StringIO();s.wr 
ite('hello\n');print repr(s.getvalue()), sys.version" 
'hello\n' 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] 

आप कोड है कि 2.7 और 3.x पर चलता है लिखने के लिए की जरूरत है, io मॉड्यूल में BytesIO वर्ग का उपयोग करें।

यदि आपको 2.7, 2.6, ... और 3.x का समर्थन करने वाला एक कोडबेस चाहिए, तो आपको थोड़ा कठिन काम करने की आवश्यकता होगी।six मॉड्यूल का उपयोग करके बहुत मदद करनी चाहिए।

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

  • कोई संबंधित समस्या नहीं^_^