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 Solutions collect form web for “AttributeError (объект '' str 'не имеет атрибута' read '')”

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

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

Это означает, что именно это говорит: что-то пыталось найти атрибут .read для объекта, который вы ему дали, и вы дали ему объект типа str (т. .read Вы дали ему строку).

Ошибка произошла здесь:

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

Ну, вы не ищете нигде, так что это должно произойти в функции 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' 

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

 #!/usr/bin/env python import json def foobar(jsonstring): msg = json.loads(jsonstring) foobar('{"batman": "yes"}') 

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

Python - лучший язык программирования в мире.