可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
In Python I'm getting an error:
Exception: (, AttributeError("'str' object has no attribute 'read'",), )
Given python code:
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']
What does this error mean and what did I do to cause it?
回答1:
The problem is that for json.load
you should pass a file like object with a read
function defined. So either you use json.load(reponse)
or json.loads(response.read())
.
回答2:
AttributeError("'str' object has no attribute 'read'",)
This means exactly what it says: something tried to find a .read
attribute on the object that you gave it, and you gave it an object of type str
(i.e., you gave it a string).
The error occurred here:
json.load (jsonofabitch)['data']['children']
Well, you aren't looking for read
anywhere, so it must happen in the json.load
function that you called (as indicated by the full traceback). That is because json.load
is trying to .read
the thing that you gave it, but you gave it jsonofabitch
, which currently names a string (which you created by calling .read
on the response
).
Solution: don't call .read
yourself; the function will do this, and is expecting you to give it the response
directly so that it can do so.
You could also have figured this out by reading the built-in Python documentation for the function (try help(json.load)
, or for the entire module (try help(json)
), or by checking the documentation for those functions on http://docs.python.org .
回答3:
If you get a python error like this:
AttributeError: 'str' object has no attribute 'some_method'
You probably poisoned your object accidentally by overwriting your object with a string.
How to reproduce this error in python with a few lines of code:
#!/usr/bin/env python import json def foobar(json): msg = json.loads(json) foobar('{"batman": "yes"}')
Run it, which prints:
AttributeError: 'str' object has no attribute 'loads'
But change the name of the variablename, and it works fine:
#!/usr/bin/env python import json def foobar(jsonstring): msg = json.loads(jsonstring) foobar('{"batman": "yes"}')
This error is caused when you tried to run a method within a string. String has a few methods, but not the one you are invoking. So stop trying to invoke a method which String does not define and start looking for where you poisoned your object.
回答4:
I was getting the Error when I was trying to read a json file
json.load(json_file)
I did the following to resolve the issue -
file_obj = open(json_file, 'r')
raw_data = file_obj.read()
fetched_list = json.loads(raw_data)
I think the problem was related to how the json file was generated, though I am not sure. Any suggestion or insight would be really helpful!