2012-06-24 34 views
63

In Python Ich erhalte eine Fehlermeldung:Attribute (" 'str' Objekt hat kein Attribut 'lesen'")

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

Da Python-Code:

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

Was bedeutet diese Fehler bedeuten und was habe ich getan, um es zu verursachen?

+68

Ich mag 'jsonofabitch' Variablenname. –

+3

Haha! Was ist das "Jsonofabitch"? : D – webmaster

+0

Scheint wie die Moderatoren von Stackoverflow haben einen Sinn für Humor, zur Abwechslung ... –

Antwort

110

Das Problem ist, dass für json.load Sie eine Datei wie Objekt mit einer read definierten Funktion übergeben sollten. Also entweder json.load(reponse) oder json.loads(response.read()).

+2

Ich verstehe das nicht ... Wie funktioniert das Lesen() das Problem zu lösen? Die Antwort hat immer noch keine Lesefunktion. Sollen wir die Zeichenfolge in ein Objekt mit einer Lesefunktion einfügen? – zakdances

+44

@yourfriendzak genau lesen, es gibt zwei verschiedene Funktionen mit sehr ähnlichen Namen. 'json.load()' nimmt ein dateiähnliches Objekt mit einer 'read()' Methode, 'json.loads()' nimmt eine Zeichenkette. Es ist leicht, das "s" am Ende zu verpassen und denke, dass es die gleiche Methode ist. – Joshmaker

+0

Dank Joshmachers Kommentar kann json.loads() den String für JSON-Daten analysieren! –

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

Das bedeutet, genau das, was es sagt: etwas versucht, ein .read Attribut für das Objekt zu finden, dass Sie es gibt, und man gibt ihm ein Objekt vom Typ str (das heißt, du hast es einen String).

Der Fehler trat hier:

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

Nun, Sie nicht für read überall suchen, so muss es in der json.load Funktion geschehen, die Sie (wie durch die volle Zurückverfolgungs) genannt. Das ist, weil json.load versucht, .read die Sache, die Sie es gaben, aber Sie gab es jsonofabitch, die derzeit eine Zeichenfolge (die Sie erstellt haben, indem Sie .read auf der response).

Lösung: Rufen Sie nicht .read selbst an; Die Funktion wird dies tun, und erwartet, dass Sie es direkt response geben, damit es dies tun kann.

Sie auch dies könnte für die Funktion der integrierten Python-Dokumentation durch das Lesen heraus (versuchen help(json.load), oder für das gesamte Modul (versuchen help(json)) oder durch die Dokumentation zu diesen Funktionen auf http://docs.python.org überprüfen.

4

Wenn Sie bekommen ein python-Fehler wie folgt aus:.

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

Sie wahrscheinlich durch Überschreiben Ihr Objekt Ihr Objekt versehentlich mit einem String vergiftet

Wie dieser Fehler in Python mit wenigen Zeilen Code reproduzieren:

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

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

Run es, das druckt:

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

Aber ändern Sie den Namen des Variablennamen und es funktioniert gut:

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

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

Dieser Fehler wird verursacht, wenn Sie versuchen, eine Methode innerhalb einer Zeichenfolge auszuführen. String hat einige Methoden, aber nicht die, die Sie aufrufen. Also hör auf, eine Methode aufzurufen, die String nicht definiert, und suche nach dem Ort, an dem du dein Objekt vergiftet hast.

Verwandte Themen