AttributeError(“’str’ object heeft geen attribuut ‘read’”)

In Python krijg ik een foutmelding:

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

Gegeven pythoncode:

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

Wat betekent deze fout en wat heb ik gedaan om deze te veroorzaken?


Antwoord 1, autoriteit 100%

Het probleem is dat je voor json.loadeen bestand als object moet doorgeven met een readfunctie gedefinieerd. Dus ofwel gebruik je json.load(response)of json.loads(response.read()).


Antwoord 2, autoriteit 8%

Als je een python-fout als deze krijgt:

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

Je hebt je object waarschijnlijk per ongeluk vergiftigd door je object te overschrijven met een string.

Hoe deze fout in python te reproduceren met een paar regels code:

#!/usr/bin/env python
import json
def foobar(json):
    msg = json.loads(json)
foobar('{"batman": "yes"}')

Voer het uit, wat wordt afgedrukt:

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

Maar verander de naam van de variabelenaam, en het werkt prima:

#!/usr/bin/env python
import json
def foobar(jsonstring):
    msg = json.loads(jsonstring)
foobar('{"batman": "yes"}')

Deze fout wordt veroorzaakt wanneer u een methode binnen een tekenreeks probeerde uit te voeren. String heeft een paar methoden, maar niet degene die u aanroept. Dus stop met proberen een methode aan te roepen die String niet definieert en ga op zoek naar waar je je object hebt vergiftigd.


Antwoord 3, autoriteit 8%

Ok, dit is een oud draadje maar.
Ik had hetzelfde probleem, mijn probleem was dat ik json.loadgebruikte in plaats van json.loads

Op deze manier heeft json geen probleem met het laden van welk woordenboek dan ook.

Officiële documentatie

json.load – Deserialiseer fp (een .read()-ondersteunend tekstbestand of binair bestand met een JSON-document) naar een Python-object met behulp van deze conversietabel.

json.loads – Deserialiseer s (een str, bytes of bytearray-instantie die een JSON-document bevat) naar een Python-object met behulp van deze conversietabel.


Antwoord 4, autoriteit 7%

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

Dit betekent precies wat het zegt: iets probeerde een .read-attribuut te vinden op het object dat je het gaf, en je gaf het een object van het type str( dat wil zeggen, je hebt er een string aan gegeven).

De fout is hier opgetreden:

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

Nou, je zoekt nergens naar read, dus het moet gebeuren in de functie json.loaddie je hebt aangeroepen (zoals aangegeven door de volledige traceback). Dat komt omdat json.loadprobeert te .readwat je het hebt gegeven, maar je hebt het jsonofabitchgegeven, wat momenteel een tekenreeks noemt (die je hebt gemaakt door .readte bellen in het response).

Oplossing: bel niet zelf .read; de functie zal dit doen en verwacht van u dat u deze rechtstreeks het responsegeeft, zodat hij dit kan doen.

Je had dit ook kunnen achterhalen door de ingebouwde Python-documentatie voor de functie te lezen (probeer help(json.load), of voor de hele module (probeer help(json)), of door de documentatie voor die functies te raadplegen op http://docs.python.org.


Antwoord 5, autoriteit 5%

U moet het bestand eerst openen. Dit werkt niet:

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

Maar dit werkt:

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

Antwoord 6

Gebruik in plaats van json.load() json.loads() en het zou werken:
bijv:

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

Other episodes