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