2010-11-27 9 views
29

पायथन 2.x में 'फ़ाइल की तरह' वस्तु के साथ:एन्कोडिंग को जानने के बिना पायथन 3 में किसी फ़ाइल में बाइट्स कैसे लिखें?

sys.stdout.write(bytes_) 
tempfile.TemporaryFile().write(bytes_) 
open('filename', 'wb').write(bytes_) 
StringIO().write(bytes_) 

कैसे अजगर 3 में भी ऐसा ही करने के लिए?

यह कैसे पायथन 2.x कोड के बराबर लिखने के लिए:

def write(file_, bytes_): 
    file_.write(bytes_) 

नोट: sys.stdout हमेशा नहीं शब्दार्थ एक पाठ धारा है। कभी-कभी बाइट्स की धारा के रूप में इसे मानना ​​फायदेमंद हो सकता है। उदाहरण के लिए, make encrypted archive of dir/ on remote machine के लिए:

tar -c dir/ | gzip | gpg -c | ssh [email protected] 'dd of=dir.tar.gz.gpg' 

इस मामले में यूनिकोड का उपयोग करने के कोई मतलब नहीं है।

उत्तर

36

यह एपीआई का उपयोग करने की बात है जो तारों की बजाय बाइट्स पर काम करता है।

sys.stdout.buffer.write(bytes_) 

docs के रूप में समझाने, आप भी detach धाराओं कर सकते हैं, तो वे डिफ़ॉल्ट रूप से बाइनरी कर रहे हैं।

यह अंतर्निहित बाइट बफर तक पहुंचता है।

tempfile.TemporaryFile().write(bytes_) 

यह पहले से ही एक बाइट एपीआई है।

open('filename', 'wb').write(bytes_) 

जैसा कि आप 'बी' से अपेक्षा करेंगे, यह एक बाइट एपीआई है।

from io import BytesIO 
BytesIO().write(bytes_) 

BytesIO बाइट StringIO के बराबर है।

संपादित करें: write बस बाइनरी फ़ाइल-जैसी ऑब्जेक्ट पर काम करेगा। तो सामान्य समाधान सिर्फ सही एपीआई ढूंढना है।

+0

वहाँ एक रास्ता जाँच टाइप करने के लिए सहारा के बिना सामान्य समारोह में लिखने के लिए है इस तरह के 'isinstance (file_, कब के रूप में .TextIOWrapper) ', आदि – jfs

+0

@ जेएफ, पायथन 3 विशेष रूप से पाठ बनाम बाइनरी विभाजन को संभालने के लिए डिज़ाइन किया गया है। एन्कोडिंग को जानने के बिना, बाइनरी और टेक्स्ट के बीच जाने का कोई सही तरीका नहीं है। इसलिए एक सामान्य फ़ंक्शन लिखने का कोई तरीका नहीं है जो टेक्स्ट स्ट्रीम में बाइट लिखता है। पाइथन 3 में गोता लगाने पर एक अच्छा [आलेख] (http://diveintopython3.org/strings.html) है। –

+0

सवाल विशेष रूप से * बाइट्स * के बारे में है। उदाहरण के लिए, 'os.write (sys.stdout.fileno(), बाइट्स_) '। – jfs

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