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


133

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

此错误是什么意思,我怎么做导致此错误?


187
我喜欢jsonofabitch变量名。
2015年

6
哈哈!那是什么“ jsonofabitch”?:D
巴哈迪尔

13
似乎Stackoverflow的主持人具有幽默感,可以改变……
Pepito Fernandez

6
2019,这仍然很有趣:P
Rishav

1
的确,让我过
得很愉快

Answers:


186

问题在于,对于json.load您,应该传递带有已read定义函数的对象之类的文件。因此,您可以使用json.load(response)json.loads(response.read())


3
我不明白这一点... read()如何解决问题?响应仍然没有读取功能。我们是否应该使用读取功能将字符串放在某个对象中?
zakdances 2012年

84
@yourfriendzak仔细阅读,这是两个具有非常相似名称的不同功能。json.load()使用read()方法json.loads()将类似对象的文件作为文件,将字符串作为文件。很容易错过结尾的“ s”,并认为它们是相同的方法。
Joshmaker

4
感谢Joshmaker的评论,json.loads()可以解析JSON数据的字符串!
Yu Yu

2
@yourfriendzak这个答案将告诉您,open您可以实现这一目标。
chaim

1
@MANISHZOPE s代表“字符串”。我同意标准库在整体上如何命名有一些严重的问题,这是如何弄乱它的一个很好的例子。
Karl Knechtel

13
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上这些功能的文档来解决此问题。


这就是OP所说的。关于帮助他人时是否更改或保留此类标识符名称,我始终持保留态度。:/
Karl Knechtel

哦,您是对的,我已经略过了...虽然我没抱怨,但:)
Andrea Ligios

12

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


7

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

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

官方文件

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

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


4

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

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

但这有效:

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

2
尝试打开文件而不是问题中的请求响应时,我在问题中发现错误。显然,在后端,json的处理方式相似,因此这个答案对我有所帮助。显然值得投票。
Nitin Khanna
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.