'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])')

আমি কেবল ১ ম ইমেলটিই নির্বাচন করছি। আমি কীভাবে সব নির্বাচন করব?

উত্তর:


181

আপনি ইতিমধ্যে ডিকোড করা কোনও অবজেক্টটি ডিকোড করার চেষ্টা করছেন । আপনার একটি আছে str, ইউটিএফ -8 থেকে আর ডিকোড করার দরকার নেই।

খালি .decode('utf-8')অংশটি ফেলে দিন :

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

আপনার fetch()কল হিসাবে , আপনি স্পষ্টভাবে শুধু প্রথম বার্তা জন্য জিজ্ঞাসা করা হয়। আপনি আরও বার্তা পুনরুদ্ধার করতে চাইলে একটি ব্যাপ্তি ব্যবহার করুন। ডকুমেন্টেশন দেখুন :

নীচের কমান্ডগুলিতে থাকা ম্যাসেজ_সেট অপশনগুলি এমন একটি স্ট্রিং যা এক বা একাধিক বার্তাগুলির উপর কাজ করতে হবে তা নির্দিষ্ট করে। এটি একটি সাধারণ বার্তা নম্বর ( '1'), বার্তা সংখ্যার একটি পরিসীমা ( '2:4'), বা কমা ( '1:3,6:9') দ্বারা পৃথক নয় এমন একদল রেঞ্জের একটি গ্রুপ হতে পারে । একটি সীমার একটি অসীম উপরের বাউন্ড ( '3:*') নির্দেশ করতে একটি নক্ষত্র থাকে ।


6
শর্তসাপেক্ষে এটি করার কোনও সহজ উপায় আছে কি? (কেবলমাত্র বার্তাটি এনকোড করা থাকলে আমি ডিকোড করতে চাই))
ডিভাইনবস্ট

5
@ দেবিনবস্ট: পাইথন 3 এ? অবজেক্টের ধরণ বা decodeবৈশিষ্ট্যের জন্য পরীক্ষা করুন বা কেবল ব্যতিক্রমটি ধরুন। try: data = data.decode('...') except AttributeError: pass
মার্টিজন পিটারস

2
@ ডিভাইনবস্ট: তবে, আপনি সাধারণত আপনার ডেটার উত্সের কাছাকাছি ডিকোডিংয়ের চেয়ে আরও ভাল, যেখানে আপনি সাধারণত যা জানবেন তা ঠিক আপনারা জানেন।
মার্টিজন পিটারস

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
এটি অকেজো। আপনি ইউটিএফ -8 এ এনকোডিং করছেন, তারপরে ফলাফল বাইটগুলি ইউটিএফ -8 হিসাবে ডিকোড করছেন, আপনি যেখানে শুরু করেছিলেন সেখানে শেষ হবে। আপনি অন্য কোনও সুবিধা ছাড়াই সিপিইউকে উষ্ণ রাখছেন।
মার্টিজন পিটারস

1
@ মার্তিজনপিটারগুলি "আপনি যেখানে শুরু করেছেন" সেখানে শেষ হচ্ছে - আপনার স্ট্রিংয়ের মধ্যে যদি পালানোর অনুক্রম থাকে না তবে উদাহরণস্বরূপ: >>> '\ u0159'.encode ()। ডিকোড ()' ř '
পিটার

1
@ পিটার: না, এর জন্য আপনার এনকোডিং বা ডিকোডিংয়ের দরকার নেই। '\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বিদ্যমান এবং কাজ করে, এবং ব্যতিক্রমটিকে প্রশ্নে ফেলে দেবে না।
মার্টিজন পিটারস


0

অন্যান্য উত্তরগুলি এতে ইঙ্গিতের ধরণ, তবে বাইটস অবজেক্টের আশা থেকে সমস্যা দেখা দিতে পারে। পাইথন 3 এ, যখন আপনার ক্লাস বাইটের কোনও বস্তু থাকে তখন ডিকোডটি কার্যকর হয়। ডিকোডের আগে এনকোড চালানো সমস্যাটিকে "সংশোধন" করতে পারে, তবে এটি অপ্রয়োজনীয় যুগল যা আমাদের প্রবাহকে সমস্যাটি বোঝায়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.