2015-02-18 26 views
59

यहाँ मेरी कोड है: मैं अब और'str' ऑब्जेक्ट में कोई विशेषता 'डीकोड' नहीं है। पायथन 3 त्रुटि?

AttributeError: 'str' object has no attribute 'decode' 

अजगर 3 डिकोड नहीं है त्रुटि संदेश मिलता है

import imaplib 
from email.parser import HeaderParser 

conn = imaplib.IMAP4_SSL('imap.gmail.com') 
conn.login('[email protected]', 'password') 
conn.select() 
conn.search(None, 'ALL') 
data = conn.fetch('1', '(BODY[HEADER])') 
header_data = data[1][0][1].decode('utf-8') 
इस बिंदु पर

, मैं सही हूँ? मैं इसे कैसे ठीक करूं?

इसके अलावा, में:

data = conn.fetch('1', '(BODY[HEADER])') 

मैं केवल 1 ईमेल का चयन कर रहा हूँ। मैं सभी का चयन कैसे करूं?

+4

@ जेम्सजैम्स 94: कृपया अपनी पोस्ट केवल ** एक ** प्रश्न पर रखें। नई समस्याओं के साथ विस्तार न रखें, इसके बजाय एक नया प्रश्न पोस्ट करें। –

उत्तर

59

आप पहले से डीकोड किए गए ऑब्जेक्ट को डीकोड करने का प्रयास कर रहे हैं। आपके पास str है, अब यूटीएफ -8 से डीकोड करने की आवश्यकता नहीं है।

header_data = data[1][0][1] 

अपने fetch() कॉल के लिए के रूप में, आप स्पष्ट रूप से सिर्फ पहला संदेश के लिए पूछ रहे हैं:

सीधे शब्दों में .decode('utf-8') हिस्सा छोड़ देते हैं। यदि आप अधिक संदेश पुनर्प्राप्त करना चाहते हैं तो एक श्रेणी का उपयोग करें।

message_set विकल्प नीचे आदेशों के लिए एक स्ट्रिंग एक या अधिक संदेश निर्दिष्ट करने पर काम किया जा करने के लिए है: documentation देखें। यह एक साधारण संदेश संख्या ('1') हो सकता है, संदेश संख्याओं की एक श्रृंखला ('2:4'), या कॉमा ('1:3,6:9') द्वारा अलग गैर-संगत श्रेणियों का एक समूह हो सकता है। एक सीमा में एक अनंत ऊपरी बाउंड ('3:*') इंगित करने के लिए तारांकन हो सकता है।

13

पायथन 3 के साथ शुरू करें, सभी स्ट्रिंग यूनिकोड ऑब्जेक्ट है।

a = 'Happy New Year' # Python 3 
    b = unicode('Happy New Year') # Python 2 

पहले कोड समान है। तो मुझे लगता है कि आपको .decode('utf-8') को हटा देना चाहिए। क्योंकि आप पहले ही यूनिकोड ऑब्जेक्ट प्राप्त कर चुके हैं।

4

इस विधि द्वारा यह प्रयोग करें:

str.encode().decode() 
+0

'bytearray (str, 'एन्कोडिंग')। डीकोड ('another_encoding') 'यदि आपको' idna' या किसी अन्य एन्कोडिंग को डीकोड करने की आवश्यकता है तो यह काम करेगा – Alex

+0

यह बेकार है। आप यूटीएफ -8 में एन्कोडिंग कर रहे हैं, फिर परिणामस्वरूप बाइट्स को यूटीएफ -8 के रूप में डीकोड कर रहे हैं, जहां आपने शुरुआत की थी। आप सीपीयू को किसी भी अन्य लाभ के साथ गर्म रखते हैं। –

0

मैं पुस्तकालय से परिचित नहीं हूँ, लेकिन यदि आपकी समस्या यह है कि आप एक बाइट सरणी नहीं करना चाहती है, एक आसान तरीका एक एन्कोडिंग प्रकार निर्दिष्ट करने के लिए है सीधे एक कलाकार में:

>>> my_byte_str 
b'Hello World' 

>>> str(my_byte_str, 'utf-8') 
'Hello World' 
+0

उनके पास शुरू करने के लिए 'बाइट्स' ऑब्जेक्ट नहीं है, और 'str (bytes_object, codec) '' bytes_object.decode (कोडेक)' के लिए सिर्फ एक वैकल्पिक वर्तनी है। यदि आपके पास वास्तव में 'str' है तो दोनों विफल हो जाते हैं। –

+0

आप सही हैं, इस विशिष्ट प्रश्न में पहले से ही 'str' है। यह उत्तर भविष्य में लोगों के लिए अभी भी उपयोगी हो सकता है जिनमें बाइट एरे हो सकते हैं (यह वह मुद्दा था जब मैंने मूल रूप से इस पोस्ट पर ठोकर खाई थी)। – Broper

+0

मुझे यकीन नहीं है कि आपने इस पोस्ट पर कैसे ठोकर खाई है, हालांकि, 'my_byte_str.decode' मौजूद है और काम करता है, और प्रश्न में अपवाद फेंक नहीं देगा। –

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

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