AttributeError: 'module' object has no attribute 'urlopen'
पायथन 3 में urllib मॉड्यूल ने request फंक्शन को एक्सेस करने का तरीका बदल दिया। इसका मतलब है कि यदि आप "urlopen" फंक्शन को उसी तरह रेफरेंस करने का प्रयास करते हैं जैसे आप पायथन 2 में करते हैं, तो आपको "AttributeError: 'module' object has no attribute 'urlopen'" एरर मिलेगी।
यह गाइड बात करती है कि इस एरर का क्या मतलब है और यह क्यों उठाई जाती है। यह इस एरर के एक उदाहरण के माध्यम से चलती है ताकि आप सीख सकें कि इसे कैसे हल किया जाए।
उदाहरण परिदृश्य
एक प्रोग्राम बनाएं जो 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 स्ट्रिंग के रूप में फॉर्मेटेड, प्रिंट स्टेटमेंट का उपयोग करके कंसोल पर। कोड चलाएं और देखें क्या होता है:
Traceback (most recent call last): File "main.py", line 4, indata = urllib.urlopen("https://jsonplaceholder.typicode.com/posts/2") AttributeError: module 'urllib' has no attribute 'urlopen'
प्रोग्राम एरर रिटर्न करता है।
समाधान
आप "urlopen" मेथड को एक्सेस करने के लिए पायथन 2 सिंटैक्स का उपयोग कर रहे हैं। "urlopen" पायथन 3 में "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" फंक्शन पायथन 3 में "urllib" का ऑब्जेक्ट नहीं है। इस फंक्शन को एक्सेस करने के लिए, अपने कोड में "urllib.request" इम्पोर्ट करें और urllib.request.urlopen() फंक्शन को रेफरेंस करें।
अब आपके पास इस पायथन एरर को एक प्रोफेशनल की तरह ठीक करने का ज्ञान है!