AttributeError (объект '' str 'не имеет атрибута' 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)
    jsonofabitch = response.read ()

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

Что означает эта ошибка и что я сделал, чтобы вызвать ее?

Ответ 1

Проблема заключается в том, что для json.load вы должны передать файл как объект с определенной функцией read. Поэтому либо вы используете json.load(reponse), либо json.loads(response.read()).

Ответ 2

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 для этой функции (попробуйте help(json.load) или для всего модуля (попробуйте help(json))) или проверите документацию для этих функций на http://docs.python.org.

Ответ 3

Если вы получите ошибку 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'

Но измените имя variablename, и оно отлично работает:

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

foobar('{"batman": "yes"}')

Эта ошибка возникает при попытке запустить метод внутри строки. Строка имеет несколько методов, но не тот, который вы вызываете. Поэтому перестаньте пытаться вызвать метод, который String не определяет и не ищет, где вы отравили ваш объект.