在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)
    jsonStr = response.read()
    
    return json.load(jsonStr)['data']['children']

这个错误是什么意思,我做了什么导致它?


当前回答

AttributeError("'str' object has no attribute 'read'",)

这就像它所说的那样:有人试图在你给它的对象上找到一个.read属性,而你给了它一个str类型的对象(即,你给了它一个字符串)。

错误发生在这里:

json.load(jsonStr)['data']['children']

你没有在任何地方寻找read,所以它必须发生在json中。您调用的Load函数(由完整的回溯指示)。这是因为json。load正在尝试.read你给它的东西,但你给它jsonStr,它目前命名一个字符串(你通过调用响应上的.read创建)。

解决方法:不要打电话给自己。函数会这样做,并期望你直接给它响应,这样它就可以这样做。

你也可以通过阅读该函数的内置Python文档(try help(json.load)),或整个模块(try help(json)),或在http://docs.python.org上查看这些函数的文档来弄清楚这一点。

其他回答

而不是json.load()使用json.loads(),它将工作: 例:

import json
from json import dumps

strinjJson = '{"event_type": "affected_element_added"}'
data = json.loads(strinjJson)
print(data)

使用json.loads()函数,将s放在后面…只是一个错误,顺便说一下,我在搜索错误后才意识到

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)
jsonStr = response.read()

return json.loads(jsonStr)['data']['children']

试试这个

如果你需要将字符串转换为json。然后使用loads()方法代替load()。Load()函数用于从文件中加载数据,因此使用Load()将字符串转换为json对象。

j_obj = json.loads('["label" : "data"]')
AttributeError("'str' object has no attribute 'read'",)

这就像它所说的那样:有人试图在你给它的对象上找到一个.read属性,而你给了它一个str类型的对象(即,你给了它一个字符串)。

错误发生在这里:

json.load(jsonStr)['data']['children']

你没有在任何地方寻找read,所以它必须发生在json中。您调用的Load函数(由完整的回溯指示)。这是因为json。load正在尝试.read你给它的东西,但你给它jsonStr,它目前命名一个字符串(你通过调用响应上的.read创建)。

解决方法:不要打电话给自己。函数会这样做,并期望你直接给它响应,这样它就可以这样做。

你也可以通过阅读该函数的内置Python文档(try help(json.load)),或整个模块(try help(json)),或在http://docs.python.org上查看这些函数的文档来弄清楚这一点。

你需要先打开文件。这行不通:

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

但这是可行的:

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