Ответ 1
Проблема заключается в том, что для json.load
вы должны передать файл как объект с определенной функцией read
. Поэтому либо вы используете json.load(reponse)
, либо json.loads(response.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']
Что означает эта ошибка и что я сделал, чтобы вызвать ее?
Проблема заключается в том, что для 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'
Но измените имя variablename, и оно отлично работает:
#!/usr/bin/env python
import json
def foobar(jsonstring):
msg = json.loads(jsonstring)
foobar('{"batman": "yes"}')
Эта ошибка возникает при попытке запустить метод внутри строки. Строка имеет несколько методов, но не тот, который вы вызываете. Поэтому перестаньте пытаться вызвать метод, который String не определяет и не ищет, где вы отравили ваш объект.