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

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

3 72

3 ответа:

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

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 .

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

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