पायथन 3 में 'बाइनरी स्ट्रिंग' को सामान्य स्ट्रिंग में कैसे बदलें?


257

उदाहरण के लिए, मेरे पास इस तरह एक स्ट्रिंग है (वापसी मूल्य subprocess.check_output):

>>> b'a string'
b'a string'

मैंने जो कुछ भी किया, वह हमेशा b'स्ट्रिंग से पहले कष्टप्रद के साथ मुद्रित होता है :

>>> print(b'a string')
b'a string'
>>> print(str(b'a string'))
b'a string'

क्या किसी के पास इसे सामान्य स्ट्रिंग के रूप में उपयोग करने या इसे सामान्य स्ट्रिंग में बदलने के बारे में कोई विचार है?



@HanfeiSun जिसे आप " बाइनरी स्ट्रिंग " कहते हैं, एक बाइट्स ऑब्जेक्ट है ( मानक लाइब्रेरी में बाइट्स ऑब्जेक्ट के बारे में जानकारी देखें )
love.by.Jesus

जवाबों:


357

इसे डिकोड करें।

>>> b'a string'.decode('ascii')
'a string'

स्ट्रिंग से बाइट्स प्राप्त करने के लिए, इसे एनकोड करें।

>>> 'a string'.encode('ascii')
b'a string'

27
@lyomi, मैंने उपयोग किया asciiक्योंकि दिए गए स्ट्रिंग को एससीआई अक्षरों के साथ बनाया गया था। एन्कोडिंग को निर्दिष्ट करने की आवश्यकता नहीं है यदि एन्कोडिंग है utf-8(डिफ़ॉल्ट रूप में पायथन 3.x str.encode, bytes.decodeडॉक-स्ट्रिंग के अनुसार )
falsetru

2
2016 में @lyomi (और इसके लगभग अंत) लोग अभी भी ascii का उपयोग करते हैं। कई 'विरासत' उत्पादों और प्रणालियों (विनिर्देशों सहित) हैं, लेकिन कई कारण भी हैं कि आप एक 'बाइनरी स्ट्रिंग' क्यों बना रहे हैं, जहाँ आप यूनिकोड या कुछ आज़माना नहीं चाहते हैं और कई बाइट्स को 'मर्ज' करना चाहते हैं एक एकल चरित्र। DNS अनुरोधों आदि के बाइनरी डेटा को शामिल करने के लिए हम अक्सर 'स्ट्रिंग्स' का उपयोग करते हैं
Jmons

मैं उत्तर को पूरा करने के लिए निम्नलिखित जोड़ने का सुझाव देता हूं। ज्यादातर बार हमें अपने ऑपरेटिंग सिस्टम से बाइट्स को डीकोड करने की आवश्यकता होती है, जैसे कंसोल आउटपुट, सबसे पाइथोनिक तरीका जो मैंने पाया है कि यह करना है import localeऔर फिर os_encoding = locale.getpreferredencoding()। इस तरह, हम my_b_string.decode(os_encoding)
जुआरियो

2
@aturegano, यह एकमात्र विकल्प नहीं है। sys.getfilesystemencoding(), sys.stdin.encoding, sys.stdout.encoding। IMHO, उन स्वचालित एन्कोडिंग का उपयोग करके समस्या का समाधान कर सकता है क्योंकि एन्कोडिंग (या यहां तक ​​कि हार्ड-कोडेड) को निर्धारित करने के लिए उप-प्रोग्राम (ओपी सबप्रोसेस का उपयोग कर रहा है) लिखा जा सकता है। वैसे भी प्रतिक्रिया के लिए धन्यवाद।
falsetru

@falsetru नोट sys.getfilesystemencoding()जो यूनिकोड फ़ाइलनाम और बाइट फ़ाइलनाम के बीच कनवर्ट करने के लिए उपयोग किए गए एन्कोडिंग का नाम देता है और आपके द्वारा उपयोग किए जा रहे ऑपरेटिंग सिस्टम पर दृढ़ता से निर्भर है। AFAIK, इस फ़ंक्शन का उपयोग सिस्टम के पसंदीदा प्रतिनिधित्व में बदलने के लिए किया जाता है। इसका मतलब है कि यह सांत्वना द्वारा उपयोग किए जाने वाले locale.getpreferredencoding()
कोडिफिकेशन का


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.