2012-06-24 13 views
63

W Pythonie Dostaję błąd:AttributeError (" 'str' obiekt ma atrybut 'czytać'")

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

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

Co to oznacza błąd i co zrobiłem, aby to spowodować?

+68

Podoba mi się nazwa zmiennej 'jsonofabitch'. –

+3

Haha! Co to za "jsonofabitch"? : D – webmaster

+0

Wygląda na to, że moderatorzy Stackoverflow mają poczucie humoru, na zmianę ... –

Odpowiedz

110

Problem polega na tym, że dla json.load należy przekazać plik podobny do obiektu o zdefiniowanej funkcji read. Więc używasz json.load(reponse) lub json.loads(response.read()).

+2

Nie rozumiem tego ... w jaki sposób doing read() rozwiązuje problem? Odpowiedź nadal nie ma funkcji odczytu. Czy mamy umieścić ciąg w jakimś obiekcie z funkcją odczytu? – zakdances

+44

@yourfriendzak czytać uważnie, to dwie różne funkcje o bardzo podobnych nazwach. 'json.load()' pobiera plik podobny do obiektu za pomocą metody 'read()', 'json.loads()' pobiera ciąg znaków. Łatwo jest przeoczyć "s" na końcu i sądzić, że są one tą samą metodą. – Joshmaker

+0

Dzięki komentarzowi Joshmakera, json.loads() może analizować ciąg znaków dla danych JSON! –

13
AttributeError("'str' object has no attribute 'read'",) 

Oznacza to dokładnie to co mówi: coś próbowali znaleźć atrybut .read na obiekcie, który go dał, a daliście to obiekt typu str (tj daliście mu ciąg znaków).

Wystąpił błąd tutaj:

json.load (jsonofabitch)['data']['children'] 

Cóż, nie szukasz read wszędzie, więc musi się zdarzyć w json.load funkcji, którą nazwie (jak wskazano w pełnym traceback). Dzieje się tak dlatego, ponieważ json.load próbuje podarować rzecz, którą podałeś, ale dałeś mu jsonofabitch, która obecnie nazywa ciąg znaków (który utworzyłeś pod numerem .read na response).

Rozwiązanie: nie należy dzwonić pod numer ; funkcja zrobi to i oczekuje, że przekażesz ją bezpośrednio, aby mógł to zrobić.

Można również zdobione to przez czytanie wbudowany w dokumentacji Pythona dla funkcji (spróbuj help(json.load), albo dla całego modułu (spróbuj help(json)) lub poprzez sprawdzenie w dokumentacji tych funkcji na http://docs.python.org.

4

Jeśli pojawi się błąd Pythona takiego:.

AttributeError: 'str' object has no attribute 'some_method' 

prawdopodobnie zatruł swój przedmiot przypadkowo przez nadpisanie swój obiekt sznurkiem

Jak odtworzyć ten błąd w Pythonie za pomocą kilku linijek kodu:

#!/usr/bin/env python 
import json 
def foobar(json): 
    msg = json.loads(json) 

foobar('{"batman": "yes"}') 

go uruchomić, która drukuje:

AttributeError: 'str' object has no attribute 'loads' 

jednak zmienić nazwę nazwaZmiennej i działa poprawnie:

#!/usr/bin/env python 
import json 
def foobar(jsonstring): 
    msg = json.loads(jsonstring) 

foobar('{"batman": "yes"}') 

Ten błąd jest spowodowany podczas próby uruchomienia metody w ciągu znaków. String ma kilka metod, ale nie ten, który wywołujesz. Więc przestań próbować wywołać metodę, której String nie definiuje i zacznij szukać, gdzie zatrułeś swój obiekt.

Powiązane problemy