In Python erhalte ich eine Fehlermeldung:
Exception: (<type 'exceptions.AttributeError'>,
AttributeError("'str' object has no attribute 'read'",), <traceback object at 0x1543ab8>)
Gegebener 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?
python
python-2.7
urllib2
attributeerror
RobinJ
quelle
quelle
jsonofabitch
Variablennamen.Antworten:
Das Problem ist, dass
json.load
Sie ein dateiähnliches Objekt mit einerread
definierten Funktion übergeben sollten. Also entweder du benutztjson.load(response)
oderjson.loads(response.read())
.quelle
json.load()
Nimmt eine Datei wie ein Objekt mit einerread()
Methode,json.loads()
nimmt eine Zeichenfolge. Es ist leicht, die "s" am Ende zu übersehen und zu denken, dass sie die gleiche Methode sind.open
erreichen können.s
steht für "string". Ich bin damit einverstanden, dass die Standardbibliothek insgesamt einige schwerwiegende Probleme mit der Benennung von Dingen hat, und dies ist ein gutes Beispiel dafür, wie sie durcheinander gebracht wird.Dies 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 gegebenstr
(dh Sie haben ihm eine Zeichenfolge gegeben).Der Fehler ist hier aufgetreten:
Nun, Sie suchen
read
nirgendwo, also muss es in der vonjson.load
Ihnen aufgerufenen Funktion geschehen (wie durch den vollständigen Traceback angezeigt). Das liegt daran , dass Siejson.load
versuchen,.read
das zu tun, was Sie ihm gegeben haben, aber Sie haben es gegebenjsonofabitch
, das derzeit eine Zeichenfolge benennt (die Sie durch Aufrufen.read
von erstellt habenresponse
).Lösung: Rufen
.read
Sie sich nicht an; Die Funktion wird dies tun und erwartet, dass Sie esresponse
direkt geben, damit es dies tun kann.Sie hätten dies auch herausfinden können, indem Sie die integrierte Python-Dokumentation für die Funktion (try
help(json.load)
oder für das gesamte Modul (tryhelp(json)
)) gelesen oder die Dokumentation für diese Funktionen unter http://docs.python.org überprüft haben .quelle
Wenn Sie einen Python-Fehler wie diesen erhalten:
Sie haben Ihr Objekt wahrscheinlich versehentlich vergiftet, indem Sie Ihr Objekt mit einer Zeichenfolge überschrieben haben.
So reproduzieren Sie diesen Fehler in Python mit ein paar Codezeilen:
Führen Sie es aus, das druckt:
Aber ändern Sie den Namen des Variablennamens, und es funktioniert gut:
Dieser Fehler wird verursacht, wenn Sie versucht haben, eine Methode innerhalb einer Zeichenfolge auszuführen. String hat einige Methoden, aber nicht die, die Sie aufrufen. Versuchen Sie also nicht mehr, eine Methode aufzurufen, die String nicht definiert, und suchen Sie, wo Sie Ihr Objekt vergiftet haben.
quelle
Ok, das ist aber ein alter Thread. Ich hatte das gleiche Problem, mein Problem war, dass ich
json.load
stattdessen verwendet habejson.loads
Auf diese Weise hat json kein Problem mit dem Laden eines Wörterbuchs.
Offizielle Dokumentation
quelle
Sie müssen zuerst die Datei öffnen. Das funktioniert nicht:
Aber das funktioniert:
quelle