web-dev-qa-db-fra.com

AttributeError ("L'objet 'str' n'a pas d'attribut 'read'")

Dans Python je reçois une erreur:

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

Étant donné le code python:

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

Que signifie cette erreur et qu'ai-je fait pour la provoquer?

100
RobinJ

Le problème est que pour json.load, vous devez transmettre un fichier comme objet avec une fonction read définie. Donc, soit vous utilisez json.load(response) ou json.loads(response.read()) .

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

Cela signifie exactement ce qu'il dit: quelque chose a essayé de trouver un attribut .read sur l'objet que vous lui avez donné et vous lui avez donné un objet de type str (c'est-à-dire, vous lui avez donné une chaîne).

L'erreur s'est produite ici:

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

Eh bien, vous ne cherchez pas read nulle part, cela doit donc se produire dans la fonction json.load que vous avez appelée (comme l'indique le traçage complet). C’est parce que json.load tente de .read ce que vous lui avez donné, mais vous l’avez donné jsonofabitch, qui nomme actuellement une chaîne (que vous avez créée en appelant .read sur le response).

Solution: n'appelez pas .read vous-même; la fonction le fera et s'attend à ce que vous lui donniez le response directement afin qu'il puisse le faire.

Vous auriez aussi pu comprendre cela en lisant la documentation intégrée Python de la fonction (essayez help(json.load), ou pour le module entier (essayez help(json)), ou en cochant la case correspondante.) documentation pour ces fonctions sur http://docs.python.org .

12
Karl Knechtel

Si vous obtenez une erreur python comme ceci:

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

Vous avez probablement empoisonné votre objet accidentellement en le remplaçant par une chaîne.

Comment reproduire cette erreur dans python avec quelques lignes de code:

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

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

Exécutez-le, qui imprime:

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

Mais changez le nom du variablename, et ça marche très bien:

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

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

Cette erreur est provoquée lorsque vous avez essayé d'exécuter une méthode dans une chaîne. String a quelques méthodes, mais pas celle que vous appelez. Alors arrêtez d'essayer d'invoquer une méthode que String ne définit pas et commencez à chercher où vous avez empoisonné votre objet.

11
Eric Leschinski