В 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']
Что означает эта ошибка и что я сделал, чтобы вызвать ее?
Проблема заключается в том, что для json.load
необходимо передать файл как объект с определенной функцией read
. Поэтому либо вы используете json.load(response)
, либо json.loads(response.read())
.
AttributeError("'str' object has no attribute 'read'",)
Это означает именно то, что написано: нечто пыталось найти атрибут .read
у объекта, который вы ему дали, а вы дали ему объект типа str
(т.е. дали ему строку).
Ошибка произошла здесь:
json.load (jsonofabitch)['data']['children']
Ну, вы нигде не ищете read
, так что это должно произойти в функции json.load
, которую вы вызвали (на что указывает полный traceback). Это происходит потому, что функция json.load
пытается .read
то, что вы ей передали, а вы передали ей jsonofabitch
, которая в данный момент называет строку (которую вы создали, вызвав .read
на response
).
Решение: не вызывайте .read
самостоятельно; функция сделает это сама, ожидая, что вы передадите ей непосредственно ответ
, чтобы она могла это сделать.
Вы также могли бы понять это, прочитав встроенную документацию 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"}')
Эта ошибка возникает, когда вы пытаетесь запустить метод внутри строки. У String есть несколько методов, но не тот, который вы вызываете. Поэтому прекратите попытки вызвать метод, который String не определяет, и начните искать, где вы отравили свой объект.