在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 :(得分:143)
问题是对于json.load
,您应该传递一个像对象这样定义了read
函数的文件。因此,您可以使用json.load(response)
或json.loads(response.read())
。
答案 1 :(得分:12)
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 :(得分:8)
如果出现这样的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有几个方法,但不是你要调用的方法。因此,请停止尝试调用String未定义的方法,并开始查找中毒对象的位置。
答案 3 :(得分:8)
您需要先打开文件。这不起作用:
f = open('test.json')
json_file = json.load(f)
但这可行:
if
答案 4 :(得分:0)
好的,这是旧线程了。
我有一个相同的问题,我的问题是我使用json.load
而不是json.loads
这样,json加载任何类型的字典都没有问题。
json.load-使用此转换表将fp(支持.read()的文本文件或包含JSON文档的二进制文件)反序列化为Python对象。
json.loads-使用此转换表将s(包含JSON文档的str,字节或字节数组实例)反序列化为Python对象。
答案 5 :(得分:0)
代替 json.load() 使用 json.loads() ,它会起作用: 例如:
import json
from json import dumps
strinjJson = '{"event_type": "affected_element_added"}'
data = json.loads(strinjJson)
print(data)