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 ответа:
проблема в том, что для
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"}')эта ошибка возникает, когда вы пытались запустить метод в строке. Строка имеет несколько методов, но не тот, который вы вызываете. Поэтому прекратите пытаться вызвать метод, который строка не определяет, и начните искать, где вы отравили свой объект.