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


182

यहाँ मेरा कोड है:

import imaplib
from email.parser import HeaderParser

conn = imaplib.IMAP4_SSL('imap.gmail.com')
conn.login('example@gmail.com', 'password')
conn.select()
conn.search(None, 'ALL')
data = conn.fetch('1', '(BODY[HEADER])')
header_data = data[1][0][1].decode('utf-8')

इस बिंदु पर मुझे त्रुटि संदेश मिलता है

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

पायथन 3 में अब कोई डिकोड नहीं है, क्या मैं सही हूं? मैं इसे कैसे ठीक करूं?

मे भी:

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

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

जवाबों:


181

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

बस .decode('utf-8')भाग को छोड़ें :

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

आपके fetch()कॉल के लिए, आप स्पष्ट रूप से केवल पहले संदेश के लिए पूछ रहे हैं। यदि आप अधिक संदेश प्राप्त करना चाहते हैं तो एक सीमा का उपयोग करें। प्रलेखन देखें :

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


6
क्या सशर्त रूप से ऐसा करने का एक सरल तरीका है? (मैं केवल संदेश को इनकोड होने पर डिकोड करना चाहता हूं।)
devinbost

5
@ डायविनबॉस्ट: पायथन 3 में? ऑब्जेक्ट प्रकार या decodeविशेषता के लिए परीक्षण करें , या केवल अपवाद को पकड़ें। try: data = data.decode('...') except AttributeError: pass
मार्टिन पीटर्स

2
@devinbost: हालांकि, आप आमतौर पर अपने डेटा के स्रोत के करीब डिकोडिंग से बेहतर होते हैं, जहां आप आमतौर पर जानते हैं कि आपके पास वास्तव में क्या है।
मार्टिन पीटर्स

37

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

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

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


37

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

str.encode().decode()

1
bytearray(str, 'encoding').decode('another_encoding')अगर आपको डिकोड करने idnaया किसी अन्य एन्कोडिंग की आवश्यकता है तो काम करेंगे
एलेक्स

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

1
@MartijnPieters "जहाँ आपने शुरू किया था" - यदि आप अपनी स्ट्रिंग में क्रम से बच गए हैं, उदाहरण के लिए: >>> '\ u0159'.encode ()। डिकोड ()' ř '
पीटर

1
@Peter: नहीं, आपको उसके लिए एन्कोडिंग या डिकोडिंग की आवश्यकता नहीं है। '\u0159'ठीक उसी आउटपुट को प्रिंट करता है। आप मूल्य के विहित प्रतिनिधित्व के साथ स्ट्रिंग शाब्दिक वाक्यविन्यास को भ्रमित कर रहे हैं।
मार्टिन पीटर्स

2
आप सीधे उपयोग कर सकते हैं, फिर से एनकोड करने और फिर से डीकोड करने की कोई आवश्यकता नहीं है।
आदित्य

10

पायथन 3 के लिए

html = """\\u003Cdiv id=\\u0022contenedor\\u0022\\u003E \\u003Ch2 class=\\u0022text-left m-b-2\\u0022\\u003EInformaci\\u00f3n del veh\\u00edculo de patente AA345AA\\u003C\\/h2\\u003E\\n\\n\\n\\n \\u003Cdiv class=\\u0022panel panel-default panel-disabled m-b-2\\u0022\\u003E\\n \\u003Cdiv class=\\u0022panel-body\\u0022\\u003E\\n \\u003Ch2 class=\\u0022table_title m-b-2\\u0022\\u003EInformaci\\u00f3n del Registro Automotor\\u003C\\/h2\\u003E\\n \\u003Cdiv class=\\u0022col-md-6\\u0022\\u003E\\n \\u003Clabel class=\\u0022control-label\\u0022\\u003ERegistro Seccional\\u003C\\/label\\u003E\\n \\u003Cp\\u003ESAN MIGUEL N\\u00b0 1\\u003C\\/p\\u003E\\n \\u003Clabel class=\\u0022control-label\\u0022\\u003EDirecci\\u00f3n\\u003C\\/label\\u003E\\n \\u003Cp\\u003EMAESTRO ANGEL D\\u0027ELIA 766\\u003C\\/p\\u003E\\n \\u003Clabel class=\\u0022control-label\\u0022\\u003EPiso\\u003C\\/label\\u003E\\n \\u003Cp\\u003EPB\\u003C\\/p\\u003E\\n \\u003Clabel class=\\u0022control-label\\u0022\\u003EDepartamento\\u003C\\/label\\u003E\\n \\u003Cp\\u003E-\\u003C\\/p\\u003E\\n \\u003Clabel class=\\u0022control-label\\u0022\\u003EC\\u00f3digo postal\\u003C\\/label\\u003E\\n \\u003Cp\\u003E1663\\u003C\\/p\\u003E\\n \\u003C\\/div\\u003E\\n \\u003Cdiv class=\\u0022col-md-6\\u0022\\u003E\\n \\u003Clabel class=\\u0022control-label\\u0022\\u003ELocalidad\\u003C\\/label\\u003E\\n \\u003Cp\\u003ESAN MIGUEL\\u003C\\/p\\u003E\\n \\u003Clabel class=\\u0022control-label\\u0022\\u003EProvincia\\u003C\\/label\\u003E\\n \\u003Cp\\u003EBUENOS AIRES\\u003C\\/p\\u003E\\n \\u003Clabel class=\\u0022control-label\\u0022\\u003ETel\\u00e9fono\\u003C\\/label\\u003E\\n \\u003Cp\\u003E(11)46646647\\u003C\\/p\\u003E\\n \\u003Clabel class=\\u0022control-label\\u0022\\u003EHorario\\u003C\\/label\\u003E\\n \\u003Cp\\u003E08:30 a 12:30\\u003C\\/p\\u003E\\n \\u003C\\/div\\u003E\\n \\u003C\\/div\\u003E\\n\\u003C\\/div\\u003E \\n\\n\\u003Cp class=\\u0022text-center m-t-3 m-b-1 hidden-print\\u0022\\u003E\\n \\u003Ca href=\\u0022javascript:window.print();\\u0022 class=\\u0022btn btn-default\\u0022\\u003EImprim\\u00ed la consulta\\u003C\\/a\\u003E \\u0026nbsp; \\u0026nbsp;\\n \\u003Ca href=\\u0022\\u0022 class=\\u0022btn use-ajax btn-primary\\u0022\\u003EHacer otra consulta\\u003C\\/a\\u003E\\n\\u003C\\/p\\u003E\\n\\u003C\\/div\\u003E"""
print(html.replace("\\/", "/").encode().decode('unicode_escape'))

मैं तुमसे बहुत प्यार करता हु!
गल शाहर

8

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

>>> my_byte_str
b'Hello World'

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

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

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

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

3

यह पहले से ही Python3 में डिकोड हो चुका है, सीधे कोशिश करें कि यह काम करे।


1
धन्यवाद @ आदित्य मैं यहां आया कारण 2to3 के साथ कोड बदलने के कारण है
जेसी रजा

0

अन्य उत्तर इस पर संकेत देते हैं, लेकिन समस्या बाइट ऑब्जेक्ट की अपेक्षा से उत्पन्न हो सकती है। पायथन 3 में, डिकोड तब मान्य होता है जब आपके पास क्लास बाइट्स का ऑब्जेक्ट होता है। डिकोड से पहले एन्कोडिंग चलाने से समस्या को "ठीक" किया जा सकता है, लेकिन यह संचालन की एक बेकार जोड़ी है जो समस्या को हमारे ऊपर की तरफ सुझाती है।

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