मैं पायथन 3 बाइट-स्ट्रिंग चर को एक नियमित स्ट्रिंग में कैसे परिवर्तित करूं?


116

मैंने XML ईमेल अनुलग्नक में पढ़ा है

bytes_string=part.get_payload(decode=False)

पेलोड एक बाइट स्ट्रिंग के रूप में आता है, जैसा कि मेरे चर नाम से पता चलता है।

मैं इस स्ट्रिंग को एक उपयोगी स्ट्रिंग में बदलने के लिए अनुशंसित पायथन 3 दृष्टिकोण का उपयोग करने की कोशिश कर रहा हूं जिसे मैं हेरफेर कर सकता हूं।

उदाहरण दिखाता है:

str(b'abc','utf-8')

मैं bअपने चर के लिए (बाइट) कीवर्ड तर्क कैसे लागू कर सकता हूं bytes_stringऔर अनुशंसित दृष्टिकोण का उपयोग कर सकता हूं ?

जिस तरह से मैंने कोशिश की वह काम नहीं करता है:

str(bbytes_string, 'utf-8')

जवाबों:


210

आपके पास अंतिम पंक्ति में यह लगभग सही था। तुम्हें चाहिए

str(bytes_string, 'utf-8')

क्योंकि जिस प्रकार का bytes_stringहै bytes, उसी प्रकार का है b'abc'


6
str(bytes_string, 'utf-8', 'ignore')तीसरे पैरामीटर को पारित करके त्रुटियों को अनदेखा किया जा सकता है।
शुभमॉय

2
ऐसा लगता है कि यह पाइलैंग के जवाब के लिए एक टिप्पणी होनी चाहिए (जो कि अमान्य इनपुट से निपटने के पते हैं)। यदि (आप मानते हैं कि) इसमें कुछ भी गलत नहीं है bytes_string, तो आप त्रुटियों को अनदेखा क्यों करना चाहेंगे?
टोबी स्पाइट

3
मुझे आपके दृष्टिकोण से निम्नलिखित त्रुटि हो रही है: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start byteनिम्नलिखित बाइट्स के लिए स्ट्रिंग b'\xbf\x8cd\xba\x7f\xe0\xf0\xb8t\xfe.TaFJ\xad\x100\x07p\xa0\x1f90\xb7P\x8eP\x90\x06)0'@TobySpeight
alper

खैर @alper, यह एक वैध UTF-8 स्ट्रिंग नहीं है, तो आपको क्या उम्मीद थी?
टोबे स्पाइट

समाधान के लिए धन्यवाद
अजय कुमार

49

पाठ को प्राप्त करने के लिए decode()एक bytesउदाहरण पर कॉल करें जो इसे एन्कोड करता है।

str = bytes.decode()

5
यूनिकोडडाउज़ररूट: 'यूटीएफ -8' कोडक 0xf6 को स्थिति 230 में बाइट को डिकोड नहीं कर सकता: अमान्य प्रारंभ बाइट
जूहा अन्टिनन

3
@JuhaUntinen आपकी एन्कोडिंग संभवतः utf-8 नहीं है।
tommy.carstensen

4
सरणी से गैर-UTF8 चरकों को कैसे फ़िल्टर करें (छोड़ें)?
डॉ। फेलोव

9

अपडेट:

bपहले और अंत में कोई भी उद्धरण नहीं है

bytesअजीब परिस्थितियों में भी, स्ट्रिंग के रूप में कैसे परिवर्तित किया जाए।

जैसा कि आपके कोड में एन्कोडिंग करने के लिए अपरिचित वर्ण हो सकते हैं 'utf-8', बिना किसी अतिरिक्त पैरामीटर के बस स्ट्रिंग का उपयोग करना बेहतर है:

some_bad_bytes = b'\x02-\xdfI#)'
text = str( some_bad_bytes )[2:-1]

print(text)
Output: \x02-\xdfI

अगर आप जोड़ते हैं 'utf-8' इन विशिष्ट बाइट्स में पैरामीटर हैं, त्रुटि प्राप्त करनी चाहिए।

जैसा कि PYTHON 3 मानक कहता है, textअब बिना किसी चिंता के utf-8 में होगा।


परिणाम "b '\\ x02 - \\ xdfI #)'" है, जो संभवतः वह नहीं चाहता है
ग्लेन थॉम्पसन

@GlenThompson यह अवांछित परिस्थितियों के लिए सिर्फ एक उदाहरण है, ऐसा हो सकता है। मैं इस विशिष्ट पाठ का जानबूझकर उपयोग करता हूं। यदि आपका मतलब है कि पाठ में bयह पहले है, तो मैंने जवाब अपडेट किया
सेइफी

बहुत बहुत धन्यवाद मैं एक स्ट्रिंग के b '' को हटाने के लिए एक रास्ता खोज रहा हूं जिसमें एन्को चरित्र के बिना एन्कोडिंग है और पात्रों को नुकसान पहुंचा रहा है, मैं अजगर में नया हूं और मुझे नहीं पता कि मैं शुरुआत से एक सरणी को कम कर सकता हूं और इंडेक्स का उपयोग करना शुरू करना: O
डिएगो फर्नांडो मुरिलो वेलेंसी

@DiegoFernandoMurilloValenci, आपका स्वागत है। खुशी है कि मैं मदद कर सकता हूं।
सेइफी

6

सरणी से गैर- UTF8 चरकों को कैसे फ़िल्टर करें (छोड़ें)?

@ Uname01 के पोस्ट और ओपी में इस टिप्पणी को संबोधित करने के लिए, त्रुटियों को अनदेखा करें:

कोड

>>> b'\x80abc'.decode("utf-8", errors="ignore")
'abc'

विवरण

से डॉक्स , यहाँ और अधिक एक ही का उपयोग कर उदाहरण हैं errorsपैरामीटर:

>>> b'\x80abc'.decode("utf-8", "replace")
'\ufffdabc'
>>> b'\x80abc'.decode("utf-8", "backslashreplace")
'\\x80abc'
>>> b'\x80abc'.decode("utf-8", "strict")  
Traceback (most recent call last):
    ...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0:
  invalid start byte

त्रुटि तर्क प्रतिक्रिया को निर्दिष्ट करता है जब इनपुट स्ट्रिंग को एन्कोडिंग के नियमों के अनुसार परिवर्तित नहीं किया जा सकता है। इस तर्क के लिए कानूनी मूल्य हैं 'strict'(एक बढ़ाएँ)UnicodeDecodeError अपवाद), 'replace'(उपयोग U+FFFD, REPLACEMENT CHARACTER), या 'ignore'(सिर्फ यूनिकोड परिणाम से बाहर चरित्र छोड़ दें)।

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