wake-up-neo.com

AttributeError ("'str' Objekt hat kein Attribut 'read'")

In Python Ich erhalte eine Fehlermeldung:

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

Gegeben 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 dieser Fehler und was habe ich getan, um ihn zu verursachen?

100
RobinJ

Das Problem ist, dass Sie für json.load Ein dateiähnliches Objekt mit einer definierten read -Funktion übergeben sollten. Verwenden Sie also entweder json.load(response) oder json.loads(response.read()) .

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

Das bedeutet genau das, was es sagt: Etwas hat versucht, ein .read - Attribut für das Objekt zu finden, das Sie ihm gegeben haben, und Sie haben ihm ein Objekt vom Typ str gegeben (dh Sie haben ihm einen String gegeben). .

Der Fehler ist hier aufgetreten:

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

Nun, Sie suchen nirgendwo nach read, also muss dies in der von Ihnen aufgerufenen Funktion json.load Geschehen (wie durch den vollständigen Traceback angegeben). Das liegt daran, dass json.load Versucht, .read Das zu geben, was Sie angegeben haben, aber Sie haben es jsonofabitch gegeben, das derzeit eine Zeichenfolge benennt (die Sie durch Aufrufen von .read Auf dem response).

Lösung: Rufen Sie .read Nicht selbst an. Die Funktion tut dies und erwartet, dass Sie ihr direkt das response geben, damit sie dies tun kann.

Sie hätten dies auch herausfinden können, indem Sie die eingebaute Python Dokumentation für die Funktion lesen (versuchen Sie help(json.load) oder für das gesamte Modul (versuchen Sie help(json)) oder in der Dokumentation unter http://docs.python.org nach diesen Funktionen suchen.

12
Karl Knechtel

Wenn Sie einen python Fehler wie diesen bekommen:

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

Wahrscheinlich haben Sie Ihr Objekt versehentlich vergiftet, indem Sie es mit einer Zeichenfolge überschrieben haben.

Wie reproduziert man diesen Fehler in python mit ein paar Codezeilen:

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

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

Führen Sie es aus, das druckt:

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

Ändern Sie jedoch den Namen der Variablen, und es funktioniert einwandfrei:

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

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

Dieser Fehler wird verursacht, wenn Sie versucht haben, eine Methode in einer Zeichenfolge auszuführen. String hat einige Methoden, aber nicht die, die Sie aufrufen. Hören Sie also auf, eine Methode aufzurufen, die String nicht definiert, und suchen Sie, wo Sie Ihr Objekt vergiftet haben.

11
Eric Leschinski