विशेषता ("'str' ऑब्जेक्ट में कोई विशेषता नहीं है 'पढ़ें'))


134

पायथन में मुझे एक त्रुटि मिल रही है:

Exception:  (<type 'exceptions.AttributeError'>,
AttributeError("'str' object has no attribute 'read'",), <traceback object at 0x1543ab8>)

अजगर कोड दिया:

def getEntries (self, sub):
    url = 'http://www.reddit.com/'
    if (sub != ''):
        url += 'r/' + sub

    request = urllib2.Request (url + 
        '.json', None, {'User-Agent' : 'Reddit desktop client by /user/RobinJ1995/'})
    response = urllib2.urlopen (request)
    jsonofabitch = response.read ()

    return json.load (jsonofabitch)['data']['children']

इस त्रुटि का क्या अर्थ है और मैंने इसे करने के लिए क्या किया?


187
मुझे jsonofabitchवैरिएबल नाम पसंद है।
सोम कालमारी Mon

6
Haha! क्या है कि "jsonofabitch"? : डी
बहादर तसदिमिर

13
Stackoverflow के मध्यस्थों की तरह लगता है, एक बदलाव के लिए हास्य की भावना है ...
Pepito फर्नांडीज

6
2019 और यह अभी भी मजेदार है: पी
रिशव

1
वास्तव में, मेरा दिन बना दिया, भविष्य से आपको धन्यवाद :)
पेसचे हेलफर

जवाबों:


187

समस्या यह है कि json.loadआप के लिए एक फाइल पास होनी चाहिए जैसे कि readडिफाइन फंक्शन वाली ऑब्जेक्ट । तो या तो आप उपयोग करें json.load(response)या json.loads(response.read())


3
मुझे यह समझ में नहीं आ रहा है ... पढ़ता () समस्या को कैसे हल करता है? प्रतिक्रिया में अभी भी एक रीड फंक्शन नहीं है। क्या हम रीड ऑब्जेक्ट के साथ स्ट्रिंग को किसी वस्तु में रखने वाले हैं?
zakdances

85
@yourfriendzak को बारीकी से पढ़ा, यह दो अलग-अलग कार्य हैं जिनके समान नाम हैं। json.load()एक read()विधि के साथ ऑब्जेक्ट की तरह एक फ़ाइल लेता है , json.loads()एक स्ट्रिंग लेता है। अंत में "एस" को याद करना आसान है और लगता है कि वे एक ही विधि हैं।
जोशमेकर

4
जोशमाकर की टिप्पणी के लिए धन्यवाद, json.loads () JSON डेटा के लिए स्ट्रिंग पार्स कर सकता है!
यू शेन

2
@yourfriendzak यह उत्तर आपको इंगित करेगा कि openआप इसे प्राप्त कर सकते हैं।
चैम

1
@MANISHZOPE का sअर्थ "स्ट्रिंग" है। मैं सहमत हूं कि मानक पुस्तकालय में कुछ गंभीर मुद्दे हैं जिनके साथ चीजों का नाम कैसे रखा गया है, और यह एक अच्छा उदाहरण है कि यह कैसे गड़बड़ हो जाता है।
कार्ल केनचेल 20

13
AttributeError("'str' object has no attribute 'read'",)

इसका मतलब ठीक यही है कि यह क्या कहता है: किसी ने .readउस वस्तु पर एक विशेषता खोजने की कोशिश की जिसे आपने दिया था, और आपने इसे एक वस्तु का प्रकार दिया str(यानी, आपने इसे एक स्ट्रिंग दिया)।

यहाँ त्रुटि हुई:

json.load (jsonofabitch)['data']['children']

ठीक है, आप readकहीं भी नहीं देख रहे हैं , इसलिए यह उस json.loadफ़ंक्शन में होना चाहिए जिसे आपने बुलाया था (जैसा कि पूर्ण ट्रेसबैक द्वारा इंगित किया गया है)। ऐसा इसलिए है क्योंकि है json.loadकरने के लिए कोशिश कर रहा है .readकि आप इसे दे दी है बात है, लेकिन आप इसे दे दी है jsonofabitch, जो वर्तमान में नाम एक स्ट्रिंग (जो आपको बुला द्वारा बनाई गई .readपर response)।

समाधान: .readअपने आप को फोन न करें ; फ़ंक्शन ऐसा करेगा, और आपसे अपेक्षा कर रहा है कि आप इसे responseसीधे दें ताकि यह ऐसा कर सके।

आप फ़ंक्शन के लिए अंतर्निहित पायथन प्रलेखन (प्रयास help(json.load), या संपूर्ण मॉड्यूल (कोशिश help(json)) के लिए, या http://docs.python.org पर उन कार्यों के लिए दस्तावेज़ की जांच करके) यह पता लगा सकते हैं ।


ओपी ने इसे क्या कहा। मैं हमेशा इस बात पर कायम हूं कि दूसरों की मदद करते समय ऐसे पहचानकर्ता नामों को बदलना या संरक्षित करना है या नहीं। : /
कार्ल क्नच्टेल

ओह, तुम सही हो, मैंने इसे स्किम कर लिया है ... मैं शिकायत नहीं कर रहा था, हालांकि :)
एंड्रिया लिगियोस

12

यदि आपको इस तरह एक अजगर त्रुटि मिलती है:

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

आपने संभवतः किसी स्ट्रिंग के साथ अपनी वस्तु को ओवरराइट करके अपनी वस्तु को गलती से जहर दे दिया है।

कोड की कुछ पंक्तियों के साथ अजगर में इस त्रुटि को कैसे पुन: उत्पन्न करें:

#!/usr/bin/env python
import json
def foobar(json):
    msg = json.loads(json)

foobar('{"batman": "yes"}')

इसे चलाएं, जो प्रिंट करता है:

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

लेकिन परिवर्तन का नाम बदलें, और यह ठीक काम करता है:

#!/usr/bin/env python
import json
def foobar(jsonstring):
    msg = json.loads(jsonstring)

foobar('{"batman": "yes"}')

यह त्रुटि तब होती है जब आपने एक स्ट्रिंग के भीतर एक विधि को चलाने की कोशिश की थी। स्ट्रिंग में कुछ विधियां हैं, लेकिन वह नहीं जिसे आप लागू कर रहे हैं। इसलिए एक ऐसी विधि को लागू करने की कोशिश करना बंद करें जो स्ट्रिंग को परिभाषित नहीं करता है और जहां आप अपनी वस्तु को जहर देते हैं, उसकी तलाश शुरू करें।


7

ठीक है, यह एक पुराना धागा है लेकिन मेरे पास एक ही मुद्दा था, मेरी समस्या का उपयोग मैं json.loadइसके बजाय किया गया थाjson.loads

इस तरह, json को किसी भी प्रकार के शब्दकोश को लोड करने में कोई समस्या नहीं है।

आधिकारिक दस्तावेज

json.load - इस रूपांतरण तालिका का उपयोग करते हुए पायथन ऑब्जेक्ट पर पाठ फ़ाइल या बाइनरी फ़ाइल (JSON दस्तावेज़ युक्त) का समर्थन करते हुए fp (a .read) का वर्णन करें।

json.loads - इस रूपांतरण तालिका का उपयोग करके पायथन ऑब्जेक्ट के लिए Deserialize s (एक str, बाइट्स या bytearray इंस्टेंस जिसमें JSON दस्तावेज़ है)।


5

आपको पहले फ़ाइल खोलने की आवश्यकता है। यह काम नहीं करता है:

json_file = json.load('test.json')

लेकिन यह काम करता है:

f = open('test.json')
json_file = json.load(f)

2
प्रश्न में अनुरोध प्रतिक्रिया के बजाय फ़ाइल खोलने का प्रयास करते समय मुझे प्रश्न में त्रुटि मिली। स्पष्ट रूप से, बैकएंड पर, json दोनों समान व्यवहार कर रहा है, और इसलिए इस उत्तर से मुझे मदद मिली। स्पष्ट रूप से एक उत्थान के लायक है।
नितिन खन्ना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.