কম্পিউটার টিউটোরিয়াল

পাইথন AttributeError: ‘module’ object has no attribute ‘urlopen’ সমাধান

urllib মডিউল পাইথন ৩-এ request ফাংশন অ্যাক্সেস করার পদ্ধতি পরিবর্তন করেছে। এর মানে যদি আপনি পাইথন ২-এ যেভাবে "urlopen" ফাংশন রেফারেন্স করার চেষ্টা করেন, আপনি "AttributeError: 'module' object has no attribute 'urlopen'" এরর সম্মুখীন হবেন।

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

AttributeError: 'module' object has no attribute 'urlopen'

"urllib" মডিউল URL ওপেন করার এবং ওয়েবসাইট থেকে ডেটা পড়ার সাথে সম্পর্কিত বেশ কিছু ফাংশন সরবরাহ করে। এই লাইব্রেরি ব্যবহার করার সিনট্যাক্স পাইথন ২ এবং পাইথন ৩-এ ভিন্ন।

পাইথন ২-এ, "urlopen" "urllib" মডিউলের অংশ। এর মানে আপনি urllib.urlopen ব্যবহার করে আপনার কোডে ইম্পোর্ট করতে পারেন। পাইথন ৩-এ, "urlopen" "urllib" মেথডের ভিতরে একটি "request" মডিউলের অংশ:

  • Python 2: urllib -> urlopen
  • Python 3: urllib -> request -> urlopen

"request" মডিউল হলো যেখানে "urllib" প্যাকেজের অনেক ওয়েব রিকোয়েস্ট ফাংশন বান্ডেল করা হয়েছে। AttributeError তখন আরাইজ হয় যখন আপনি একটি মডিউল থেকে এমন একটি অ্যাট্রিবিউট অ্যাক্সেস করার চেষ্টা করেন যেটি সেটি কন্টেইন করে না। এই কেসে, "urlopen" "urllib" মডিউলের অংশ নয়।

একটি উদাহরণ সিনেরিও

একটি প্রোগ্রাম বানান যা JSONPlaceholder নামে একটি সার্ভিস থেকে ডেটা রিট্রিভ করে। এই সার্ভিস ডামি ডেটা সরবরাহ করে যা আপনি আপনার উদাহরণে ব্যবহার করতে পারেন।

ID #2 가진 একটি সিঙ্গেল পোস্ট রিট্রিভ করি। শুরুতে urllib মডিউল ইম্পোর্ট করি:

import urllib

এই স্টেটমেন্ট আপনাকে "urllib" মডিউলের ভিতরে থাকা ফাংশনগুলো প্রোগ্রামে ব্যবহার করতে দেয়।

এরপর, "urlopen" ব্যবহার করে একটি রিকোয়েস্ট করি। এটি JSONPlaceholder API-এ একটি এন্ডপয়েন্ট থেকে ডেটা রিট্রিভ করতে দেবে:

data = urllib.urlopen("https://jsonplaceholder.typicode.com/posts/2")
contents = data.read()
print(as_json)

এই কোড JSONPlaceholder API-এ ID #2 가진 পোস্টের ডেটা পড়ে।

কোড আমাদের রিকোয়েস্ট থেকে রেসপন্স, JSON স্ট্রিং হিসেবে ফরম্যাটেড, কনসোলে প্রিন্ট করে একটি print স্টেটমেন্ট ব্যবহার করে। কোড রান করি এবং দেখি কী হয়:

Traceback (most recent call last):
  File "main.py", line 4, in 
    data = urllib.urlopen("https://jsonplaceholder.typicode.com/posts/2")
AttributeError: module 'urllib' has no attribute 'urlopen'

প্রোগ্রাম একটি এরর রিটার্ন করে।

সমাধান

আপনি "urlopen" মেথড অ্যাক্সেস করতে পাইথন ২ সিনট্যাক্স ব্যবহার করছেন। "urlopen" পাইথন ৩-এ "urllib"-এর অ্যাট্রিবিউট নয়। আপনি "urlopen"-কে "urllib"-এর অ্যাট্রিবিউট হিসেবে রেফারেন্স করছেন তাই প্রোগ্রাম সঠিকভাবে রান করতে ব্যর্থ হচ্ছে।

এই সমস্যা সমাধান করতে, "urllib" মডিউল থেকে "request" মডিউল ইম্পোর্ট করুন। এই মডিউলে "urlopen" মেথড রয়েছে:

import urllib.request

এরপর, কোড পরিবর্তন করুন যাতে আপনি JSONPlaceholder API থেকে ডেটা রিট্রিভ করার সময় urllib.request মডিউল রেফারেন্স করেন:

data = urllib.request.urlopen("https://jsonplaceholder.typicode.com/posts/2")
contents = data.read().decode('utf-8')
print(contents)

এই কোড আমাদের কল করা API এন্ডপয়েন্টের কন্টেন্ট পড়বে। আমাদের কোড রান করি:

{
  "userId": 1,
  "id": 2,
  "title": "qui est esse",
  "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
}

আপনি decode() মেথড ব্যবহার করে পাওয়া রেসপন্স ডিকোড করেছেন। এটি করুন যাতে আপনি urlopen() মেথড দ্বারা রিটার্ন করা ভ্যালু স্ট্রিং হিসেবে পড়তে পারেন।

উপসংহার

"urlopen" ফাংশন পাইথন ৩-এ "urllib"-এর অবজেক্ট নয়। এই ফাংশন অ্যাক্সেস করতে, "urllib.request" আপনার কোডে ইম্পোর্ট করুন এবং urllib.request.urlopen() ফাংশন রেফারেন্স করুন।

এখন আপনার এই পাইথন এরর প্রফেশনালের মত ফিক্স করার নলেজ আছে!

  1. পাইথন অবজেক্ট কম্পैरিজন: "is" বনাম "=="

  2. পাইথন উইক রেফারেন্স

  3. পাইথনে অবজেক্টের অ্যাট্রিবিউট আছে কিনা জানা যাবে কীভাবে?

  4. পাইথনে TimeTuple কী?