Warum erhalte ich “‘str’ object has no attribute ‘read'”, wenn ich versuche, `json.load` für eine Zeichenfolge zu verwenden? [duplicate]

Lesezeit: 4 Minuten

Benutzeravatar von RobinJ
RobinJ

In Python erhalte ich einen Fehler:

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)
    jsonStr = response.read()
    
    return json.load(jsonStr)['data']['children']

Was bedeutet dieser Fehler und was habe ich getan, um ihn zu verursachen?

Benutzeravatar von mutantacule
Mutante

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

  • Ich verstehe das nicht … wie löst read() das Problem? Die Antwort hat noch keine Lesefunktion. Sollen wir den String in ein Objekt mit einer Lesefunktion einfügen?

    – Zak-Tänze

    11. August 2012 um 9:37 Uhr

  • @yourfriendzak genau lesen, es sind zwei verschiedene Funktionen mit sehr ähnlichen Namen. json.load() nimmt eine Datei wie ein Objekt mit a read() Methode, json.loads() nimmt eine Schnur. Es ist leicht, das “s” am Ende zu übersehen und zu denken, dass es sich um dieselbe Methode handelt.

    – Joschmacher

    25. April 2013 um 12:02 Uhr

  • Dank Joshmakers Kommentar kann json.loads() Zeichenfolgen für JSON-Daten analysieren!

    – Yu Shen

    10. Mai 2013 um 2:43 Uhr

  • @yourfriendzak Diese Antwort würde dich darauf hinweisen open das kannst du erreichen.

    – chaim

    13. Juli 2014 um 3:38 Uhr

  • @MANISHZOPE die s steht für “Schnur”. Ich stimme zu, dass die Standardbibliothek insgesamt einige ernsthafte Probleme mit der Benennung von Dingen hat, und dies ist ein gutes Beispiel dafür, wie sie durcheinander gebracht wird.

    – Karl Knechtel

    9. Januar 2016 um 20:04 Uhr


Ok, das ist ein alter Thread, aber. Ich hatte das gleiche Problem, mein Problem war, dass ich verwendet wurde json.load anstatt json.loads

Auf diese Weise hat json kein Problem mit dem Laden jeglicher Art von Wörterbuch.

Offizielle Dokumentation

json.load – Deserialisiert fp (eine .read()-unterstützende Textdatei oder Binärdatei, die ein JSON-Dokument enthält) mithilfe dieser Konvertierungstabelle in ein Python-Objekt.

json.loads – Deserialisiert s (eine str-, bytes- oder bytearray-Instanz, die ein JSON-Dokument enthält) mithilfe dieser Konvertierungstabelle in ein Python-Objekt.

Benutzeravatar von music_piano
Musik_Klavier

Sie müssen die Datei zuerst öffnen. Das funktioniert nicht:

json_file = json.load('test.json')

Aber das funktioniert:

f = open('test.json')
json_file = json.load(f)

  • Ich habe den Fehler in der Frage gefunden, als ich versuchte, eine Datei anstelle einer Anforderungsantwort in der Frage zu öffnen. Offensichtlich behandelt json am Backend beide ähnlich, und daher hat mir diese Antwort geholfen. Eindeutig eine positive Bewertung wert.

    – Nitin Khanna

    16. April 2020 um 19:34 Uhr

Wenn Sie einen Python-Fehler wie diesen erhalten:

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

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

So reproduzieren Sie diesen Fehler in Python mit ein paar Zeilen Code:

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

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

Führen Sie es aus, was Folgendes ausgibt:

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

Aber ändern Sie den Namen des Variablennamens, 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 versucht haben, eine Methode innerhalb 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 nach der Stelle, an der Sie Ihr Objekt vergiftet haben.

Benutzeravatar von Karl Knechtel
Karl Knechtel

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

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

Der Fehler ist hier aufgetreten:

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

Nun, Sie suchen nicht read nirgendwo, also muss es in der passieren json.load Funktion, die Sie aufgerufen haben (wie durch die vollständige Rückverfolgung angegeben). Das ist, weil json.load versucht es .read das Ding, das du ihm gegeben hast, aber du hast es gegeben jsonStrdie derzeit eine Zeichenfolge benennt (die Sie durch Aufrufen von erstellt haben .read auf der response).

Lösung: Nicht anrufen .read du selbst; die Funktion wird dies tun und erwartet, dass Sie ihr das geben response direkt, damit es dies tun kann.

Sie hätten dies auch herausfinden können, indem Sie die integrierte Python-Dokumentation für die Funktion gelesen haben (try help(json.load)oder für das gesamte Modul (try help(json)) oder indem Sie die Dokumentation für diese Funktionen auf überprüfen http://docs.python.org .

Benutzeravatar von Pallav Ghose
Pallav Ghose

Verwenden Sie anstelle von json.load() json.loads() und es würde funktionieren: z.

import json
from json import dumps

strinjJson = '{"event_type": "affected_element_added"}'
data = json.loads(strinjJson)
print(data)

Benutzeravatar von Lemon
Zitrone

Also nicht verwenden json.load(data.read()) verwenden json.loads(data.read()):

def findMailOfDev(fileName):
    file=open(fileName,'r')
    data=file.read();
    data=json.loads(data)
    return data['mail']

1443250cookie-checkWarum erhalte ich “‘str’ object has no attribute ‘read'”, wenn ich versuche, `json.load` für eine Zeichenfolge zu verwenden? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy