) Gegeven python code: def getEntries (self, sub): url ="> ) Gegeven python code: def getEntries (self, sub): url ="> ) Gegeven python code: def getEntries (self, sub): url =" />

AttributeError ("'str' object heeft geen attribuut 'lezen'")

In Python krijg ik een foutmelding:

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

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

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

71
Het lijkt erop dat de moderators van StackOverflow een gevoel voor humor hebben, voor de verandering ...
toegevoegd de auteur Pepito Fernandez, de bron
Haha! Wat is dat "jsonofabitch"? : D
toegevoegd de auteur Bahadir Tasdemir, de bron
Ik hou van de jsonofabitch variabelenaam.
toegevoegd de auteur Mon Calamari, de bron

3 antwoord

Het probleem is dat je voor json.load een bestand als object moet doorgeven met een gedefinieerde lees functie. Dus ofwel gebruik je json.load (reponse) of json.loads (response.read ()) .

122
toegevoegd
Dankzij de opmerking van Joshmaker kan json.loads() string voor JSON-gegevens parseren!
toegevoegd de auteur Yu Shen, de bron
Ik begrijp dit niet ... hoe lost doen reads() het probleem op? Het antwoord heeft nog steeds geen leesfunctie. Moeten we de tekenreeks in een object plaatsen met een leesfunctie?
toegevoegd de auteur zakdances, de bron
Bedankt Joshmaker. Je en ik zijn nuttig voor mij. laden, laden .... Hoe on-intuïtieve namen gegeven door makers van de bibliotheek. Echt onlogisch
toegevoegd de auteur MANISH ZOPE, de bron
@MANISHZOPE de s staat voor "string". Ik ben het ermee eens dat de standaardbibliotheek een aantal serieuze problemen heeft met betrekking tot hoe de dingen worden genoemd, en dit is een goed voorbeeld van hoe het wordt verknoeid.
toegevoegd de auteur Karl Knechtel, de bron
@yourfriendzak Dit antwoord wijst u dat met open kunt u dat bereiken.
toegevoegd de auteur chaim, de bron
@uwvriendzak aandachtig lezen, het zijn twee verschillende functies met zeer vergelijkbare namen. json.load() neemt een bestand zoals object met een read() methode, json.loads() neemt een string. Het is gemakkelijk om de "s" aan het einde te missen en te denken dat het dezelfde methode is.
toegevoegd de auteur Joshmaker, de bron
AttributeError("'str' object has no attribute 'read'",)

Dit betekent precies wat het zegt: er is geprobeerd een .read -attribuut te vinden op het object dat u het hebt gegeven, en u hebt het een object van het type str gegeven (dwz gaf het een string).

De fout is opgetreden hier:

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

Nou, je zoekt nergens naar lezen , dus het moet gebeuren in de json.load -functie die je noemde (zoals aangegeven door de volledige traceback). Dat komt omdat json.load probeert .read het ding dat je hebt gegeven, maar je gaf het jsonofabitch , die momenteel een string noemt (die u hebt gemaakt door .read aan te roepen op het antwoord ).

Oplossing: bel .read niet zelf; de functie zal dit doen en verwacht dat u het de reactie rechtstreeks geeft, zodat dit kan.

U 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 controleren op http://docs.python.org .

12
toegevoegd

Als u een python-foutmelding krijgt zoals deze:

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

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

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, waarbij wordt afgedrukt:

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

Wijzig de naam van de variablenaam en het werkt goed:

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

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

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

5
toegevoegd