AttributeError(“& # 39;str # 39;对象没有属性'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)
jsonStr = response.read()
    

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

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

413484 次浏览

问题是,对于json.load,你应该传递一个类似object的文件,其中定义了read函数。所以你要么使用json.load(response),要么使用json.loads(response.read())

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

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

错误发生在这里:

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

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

解决方案:不要自己调用.read;函数会这样做,并期望你直接给它response,这样它就可以这样做。

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

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

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

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

正式文档 .

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

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

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

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

但这是可行的:

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

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

import json
from json import dumps


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

因此,不要使用json.load(data.read()),而是使用json.loads(data.read()):

def findMailOfDev(fileName):
file=open(fileName,'r')
data=file.read();
data=json.loads(data)
return data['mail']

使用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']

试试这个