问题:AttributeError(“’str’对象没有属性’read’”)
在Python中,我得到一个错误:
Exception: (<type 'exceptions.AttributeError'>,
AttributeError("'str' object has no attribute 'read'",), <traceback object at 0x1543ab8>)
给定python代码:
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']
此错误是什么意思,我怎么做导致此错误?
回答 0
问题在于,对于json.load
您,应该传递带有已read
定义函数的对象之类的文件。因此,您可以使用json.load(response)
或json.loads(response.read())
。
回答 1
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
直接给它以使其可以执行操作。
您也可以通过阅读功能的内置Python文档(try help(json.load)
或整个模块(try help(json)
)),或通过查看http://docs.python.org上这些功能的文档来解决此问题。
回答 2
如果收到这样的python错误:
AttributeError: 'str' object has no attribute 'some_method'
您可能通过用字符串覆盖对象意外地中毒了对象。
如何用几行代码在python中重现此错误:
#!/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"}')
当您尝试在字符串中运行方法时,导致此错误。字符串有几种方法,但是您没有调用。因此,停止尝试调用String未定义的方法,并开始寻找在何处毒害了对象。
回答 3
好的,这是旧线程了。我有一个相同的问题,我的问题是我用了json.load
而不是json.loads
这样,json加载任何类型的字典都没有问题。
json.load-使用此转换表将fp(支持.read()的文本文件或包含JSON文档的二进制文件)反序列化为Python对象。
json.loads-使用此转换表将s(包含JSON文档的str,字节或字节数组实例)反序列化为Python对象。
回答 4
您需要先打开文件。这不起作用:
json_file = json.load('test.json')
但这有效:
f = open('test.json')
json_file = json.load(f)