AttributeError(“'str'对象没有属性'read'”)

时间:2012-06-24 00:12:14

标签: python python-2.7 urllib2 attributeerror canonical-quickly

在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']

这个错误意味着什么,我做了什么导致它?

6 个答案:

答案 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加载任何类型的字典都没有问题。

Official documentation

  

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)