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

Rob*_*inJ 112 python urllib2 attributeerror python-2.7 canonical-quickly

在Python中我收到一个错误:

Exception:  (<type 'exceptions.AttributeError'>,
AttributeError("'str' object has no attribute 'read'",), <traceback object at 0x1543ab8>)
Run Code Online (Sandbox Code Playgroud)

给出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']
Run Code Online (Sandbox Code Playgroud)

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

kos*_*sii 161

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

  • @yourfriendzak仔细阅读,它是两个不同的功能,名称非常相似.`json.load()`使用`read()`方法获取类似对象的文件,`json.loads()`接受一个字符串.最后很容易错过"s"并认为它们是相同的方法. (72认同)
  • @MANISHZOPE `s` 代表“字符串”。我同意标准库在事物的命名方式方面存在一些严重的问题,这是一个很好的例子,说明它是如何搞砸的。 (5认同)
  • 感谢Joshmaker的评论,json.loads()可以解析JSON数据的字符串! (3认同)
  • 我不明白这一点...... read()如何解决这个问题?响应仍然没有读取功能.我们是否应该使用read函数将字符串放在某个对象中? (2认同)
  • @yourfriendzak这个[answer](http://stackoverflow.com/questions/2835559/parsing-values-from-a-json-file-in-python)会指出,使用“ open”可以实现这一目标。 (2认同)

小智 20

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

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

官方文档

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

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


Kar*_*tel 12

AttributeError("'str' object has no attribute 'read'",)
Run Code Online (Sandbox Code Playgroud)

这意味着它所说的内容:某些东西试图.read在你给它的对象上找到一个属性,你给它一个类型的对象str(即,你给它一个字符串).

这里发生错误:

json.load (jsonofabitch)['data']['children']
Run Code Online (Sandbox Code Playgroud)

好吧,你不是在寻找read任何地方,所以它必须发生在json.load你调用的函数中(如完整的追溯所示).这是因为json.load试图.read,你给它的东西,但你给了它jsonofabitch,目前名称的字符串(通过调用创建.readresponse).

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

您也可以通过阅读函数的内置Python文档(尝试help(json.load),或整个模块(尝试help(json)))或通过检查http://docs.python.org上的这些函数的文档来解决这个问题.


Eri*_*ski 12

如果你得到这样的python错误:

AttributeError: 'str' object has no attribute 'some_method'
Run Code Online (Sandbox Code Playgroud)

您可能通过用字符串覆盖对象而意外中毒了对象.

如何使用几行代码在python中重现此错误:

#!/usr/bin/env python
import json
def foobar(json):
    msg = json.loads(json)

foobar('{"batman": "yes"}')
Run Code Online (Sandbox Code Playgroud)

运行它,打印:

AttributeError: 'str' object has no attribute 'loads'
Run Code Online (Sandbox Code Playgroud)

但是更改变量名的名称,它可以正常工作:

#!/usr/bin/env python
import json
def foobar(jsonstring):
    msg = json.loads(jsonstring)

foobar('{"batman": "yes"}')
Run Code Online (Sandbox Code Playgroud)

当您尝试在字符串中运行方法时,会导致此错误.String有几个方法,但不是你要调用的方法.因此,请停止尝试调用String未定义的方法,并开始查找中毒对象的位置.


mus*_*ano 12

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

json_file = json.load('test.json')
Run Code Online (Sandbox Code Playgroud)

但这有效:

f = open('test.json')
json_file = json.load(f)
Run Code Online (Sandbox Code Playgroud)

  • 当我尝试打开文件而不是问题中的请求响应时,我发现问题中存在错误。显然,在后端, json 对两者的处理类似,所以这个答案对我有帮助。显然值得点赞。 (3认同)

小智 6

使用 json.loads() 而不是 json.load() ,它会起作用:例如:

import json
from json import dumps

strinjJson = '{"event_type": "affected_element_added"}'
data = json.loads(strinjJson)
print(data)
Run Code Online (Sandbox Code Playgroud)