2012-06-24 4 views
63

В Python Я получаю сообщение об ошибке:AttributeError (" 'ул' объект не имеет атрибута" чтение")

Exception: (<type 'exceptions.AttributeError'>, 
AttributeError("'str' object has no attribute 'read'",), <traceback object at 0x1543ab8>) 

Данный код питона:

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'] 

Что означает эта ошибка и что я сделал, чтобы вызвать это?

+68

Мне нравится имя переменной jsonofabitch. –

+3

Ха-ха! Что это за «jsonofabitch»? : D – webmaster

+0

Похоже, модераторы Stackoverflow имеют чувство юмора, для изменения ... –

ответ

110

Проблема в том, что для json.load вы должны передать файл как объект с заданной функцией read. Поэтому либо вы используете json.load(reponse), либо json.loads(response.read()).

+2

Я не понимаю этого ... как делает чтение() решает проблему? У ответа по-прежнему нет функции чтения. Должны ли мы помещать строку в некоторый объект с функцией чтения? – zakdances

+44

@yourfriendzak внимательно читайте, это две разные функции с очень похожими именами. 'json.load()' принимает файл, подобный объекту с помощью метода 'read()', 'json.loads()' принимает строку. Легко пропустить «s» в конце и думать, что они являются одним и тем же методом. – Joshmaker

+0

Благодаря комментарию Joshmaker, json.loads() может анализировать строку для данных JSON! –

13
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 самостоятельно; функция будет делать это и ожидает, что вы дадите ей response, чтобы он мог это сделать.

Вы можете также поняли это, читая встроенную документацию Python для функции (попробуйте help(json.load), или для всего модуля (попробуйте help(json)), или путем проверки документации для этих функций на http://docs.python.org.

4

Если вы получаете ошибку питона вроде этого:.

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 не определяет, и начать искать, где вы отравили свой объект.

Смежные вопросы