В 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']
Что означает эта ошибка и что я сделал, чтобы вызвать ее?
jsonofabitch
имя переменной.Ответы:
Проблема в том, что
json.load
вам нужно передать файл, подобный объекту с определеннойread
функцией. Так что либо вы используете,json.load(response)
либоjson.loads(response.read())
.источник
json.load()
принимает файл как объект сread()
методом,json.loads()
принимает строку. В конце легко пропустить букву «с» и подумать, что это один и тот же метод.open
вы можете достичь этого.s
означает "строка". Я согласен, что у стандартной библиотеки есть некоторые серьезные проблемы с тем, как называются вещи, и это хороший пример того, как она испортилась.Это означает именно то, что написано: что-то пыталось найти
.read
атрибут объекта, который вы ему дали, и вы дали ему объект типаstr
(то есть вы дали ему строку).Ошибка произошла здесь:
Ну, вы
read
нигде не ищите , поэтому это должно происходить вjson.load
вызванной вами функции (как указано в полной трассировке). Это происходит потому , чтоjson.load
пытается.read
вещь , что вы дали, но вы далиjsonofabitch
, которые в настоящее время имена строка (которую вы создали, позвонив.read
наresponse
).Решение: не называйте
.read
себя; функция сделает это, и ожидает, что вы передадите ееresponse
напрямую, чтобы она могла это сделать.Вы могли бы также выяснить это, прочитав встроенную документацию Python для функции (try
help(json.load)
или для всего модуля (tryhelp(json)
)), или проверив документацию для этих функций на http://docs.python.org .источник
Если вы получаете ошибку Python, как это:
Вы вероятно отравили свой объект случайно, перезаписав свой объект строкой.
Как воспроизвести эту ошибку в python с помощью нескольких строк кода:
Запустите его, который печатает:
Но измените имя переменной name, и она отлично работает:
Эта ошибка возникает, когда вы пытались запустить метод в строке. String имеет несколько методов, но не тот, который вы вызываете. Так что перестаньте пытаться вызвать метод, который String не определяет, и начните искать, где вы отравили свой объект.
источник
Хорошо, это старая ветка, но. У меня была такая же проблема, моя проблема заключалась в том, что я использовал
json.load
вместоjson.loads
Таким образом, у json нет проблем с загрузкой любого словаря.
Официальная документация
источник
Сначала вам нужно открыть файл. Это не работает:
Но это работает:
источник