অ্যাট্রিবিউটআরার ("'স্ট্রিং' অবজেক্টের কোনও 'গুণ' পঠন নেই"))


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পরিবর্তনশীল নাম পছন্দ করি ।
সোম কলমারি

6
হা হা! "জসনোফ্যাবিচ" কী? : ডি
বাহাদির তাসদেমির

13
দেখে মনে হচ্ছে স্ট্যাকওভারফ্লো এর মডারেটরদের মধ্যে একটি হাসির অনুভূতি রয়েছে, পরিবর্তনের জন্য ...
পেপিতো ফার্নান্দেজ

6
2019 এবং এটি এখনও মজার: পি
ষভ

1
প্রকৃতপক্ষে, আমার দিনটি তৈরি করেছে, ভবিষ্যত থেকে আপনাকে ধন্যবাদ :)
পেশে হেলফার

উত্তর:


187

সমস্যাটি হ'ল json.loadআপনার পক্ষে কোনও readফাংশন সংজ্ঞায়িত করে অবজেক্টের মতো ফাইল পাস করা উচিত । সুতরাং হয় আপনি ব্যবহার json.load(response)বা json.loads(response.read())


3
আমি এটি বুঝতে পারি না ... পড়ার ফলে কীভাবে সমস্যার সমাধান হয়? প্রতিক্রিয়াটিতে এখনও একটি পঠন ফাংশন নেই। আমাদের কি পড়ার ফাংশন সহ কোনও বস্তুতে স্ট্রিংটি রাখার কথা?
জাকদানস

85
@ আপনার বন্ধুরাজাক নিবিড়ভাবে পড়ুন, এটি দুটি একই রকমের নামের সাথে আলাদা আলাদা ফাংশন। json.load()একটি read()পদ্ধতির সাথে অবজেক্টের মতো একটি ফাইল json.loads()নেয়, একটি স্ট্রিং নেয়। শেষে "এস" মিস করা সহজ এবং সেগুলি একই পদ্ধতি বলে মনে হয়।
জোশমেকার

4
জোশমেকারের মন্তব্যে ধন্যবাদ, json.loads () JSON ডেটার জন্য স্ট্রিংকে পার্স করতে পারে!
ইউ শেন

2
@ ইয়োরফ্রেন্ডজাক এই উত্তরটি আপনাকে নির্দেশ করবে যে আপনার সাথে openএটি অর্জন করতে পারে।
chaim

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

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 - রূপান্তর টেবিলটি ব্যবহার করে পাইথন অবজেক্টে fp (a .read () - সমর্থনকারী পাঠ্য ফাইল বা একটি JSON নথি সম্বলিত বাইনারি ফাইল) ডিজিজারাইজ করুন।

json.loads - এই রূপান্তর টেবিলটি ব্যবহার করে পাইথন অবজেক্টে ডিসরিয়ালাইজ করুন (একটি স্ট্রিং, বাইটস বা জাইটসন ডকুমেন্ট সম্বলিত বাইটায়ার উদাহরণ)।


5

আপনাকে প্রথমে ফাইলটি খুলতে হবে। এটি কাজ করে না:

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

তবে এটি কাজ করে:

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

2
প্রশ্নটিতে একটি অনুরোধের প্রতিক্রিয়ার পরিবর্তে কোনও ফাইল খোলার চেষ্টা করার সময় আমি প্রশ্নটিতে ত্রুটিটি পেয়েছি। স্পষ্টতই, ব্যাকএন্ডে, জসন উভয়কে একইরকম আচরণ করছে এবং তাই এই উত্তরটি আমাকে সাহায্য করেছিল। স্পষ্টত একটি upvote মূল্য।
নিতিন খান্না
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.