184

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

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

4

6 回答 6

246

问题是json.load你应该传递一个像对象一样read定义函数的文件。所以要么你使用json.load(response)要么json.loads(response.read())

于 2012-06-24T00:33:50.790 回答
32

好的,这是一个旧线程但是。我有同样的问题,我的问题是我使用json.load而不是json.loads

这样,json 加载任何类型的字典都没有问题。

官方文档

json.load - 使用此转换表将 fp(支持 .read() 的文本文件或包含 JSON 文档的二进制文件)反序列化为 Python 对象。

json.loads - 使用此转换表将 s(包含 JSON 文档的 str、bytes 或 bytearray 实例)反序列化为 Python 对象。

于 2019-12-20T09:28:12.953 回答
20

如果您收到这样的 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 未定义的方法,并开始寻找您毒害对象的位置。

于 2014-10-29T19:51:44.813 回答
19

您需要先打开文件。这不起作用:

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

但这有效:

f = open('test.json')
json_file = json.load(f)
于 2020-03-02T16:31:51.153 回答
17
AttributeError("'str' object has no attribute 'read'",)

这正是它所说的:某物试图.read在你给它的对象上找到一个属性,你给它一个类型的对象str(即,你给它一个字符串)。

错误发生在这里:

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

好吧,您不是在寻找read任何地方,因此它必须发生在json.load您调用的函数中(如完整回溯所示)。那是因为json.load正在尝试.read你给它的东西,但是你给了它jsonofabitch,它当前命名一个字符串(你通过调用创建.readresponse

解决方法:不要给.read自己打电话;该函数将执行此操作,并希望您直接给它,response以便它可以这样做。

您也可以通过阅读函数的内置 Python 文档(tryhelp(json.load)或整个模块 (try help(json)) 或通过查看http://docs.python.org上的这些函数的文档来了解这一点。

于 2012-06-24T02:19:32.810 回答
2

代替 json.load() 使用 json.loads() 它会起作用:例如:

import json
from json import dumps

strinjJson = '{"event_type": "affected_element_added"}'
data = json.loads(strinjJson)
print(data)
于 2021-07-30T23:12:55.550 回答