En Python, j'obtiens une erreur:
Exception: (<type 'exceptions.AttributeError'>,
AttributeError("'str' object has no attribute 'read'",), <traceback object at 0x1543ab8>)
Compte tenu du 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?
jsonofabitch
nom de variable.Réponses:
Le problème est que pour
json.load
vous devez passer un fichier comme un objet avec uneread
fonction définie. Donc, soit vous utilisezjson.load(response)
oujson.loads(response.read())
.la source
json.load()
prend un fichier comme un objet avec uneread()
méthode,json.loads()
prend une chaîne. Il est facile de rater le «s» à la fin et de penser qu'il s'agit de la même méthode.open
vous pouvez y parvenir.s
signifie "chaîne". Je conviens que la bibliothèque standard a globalement de sérieux problèmes avec la façon dont les choses sont nommées, et c'est un bon exemple de la façon dont elle est gâchée.Cela signifie exactement ce qu'il dit: quelque chose a essayé de trouver un
.read
attribut sur l'objet que vous lui avez donné, et vous lui avez donné un objet de typestr
(c'est-à-dire que vous lui avez donné une chaîne).L'erreur s'est produite ici:
Eh bien, vous ne cherchez
read
nulle part, donc cela doit se produire dans lajson.load
fonction que vous avez appelée (comme indiqué par le traçage complet). C'est parce que vousjson.load
essayez de.read
la chose que vous lui avez donnée, mais vous l'avez donnéejsonofabitch
, qui nomme actuellement une chaîne (que vous avez créée en appelant.read
leresponse
).Solution: ne vous appelez
.read
pas; la fonction fera cela, et attend de vous que vous lui donniezresponse
directement pour qu'elle puisse le faire.Vous pourriez également avoir compris cela en lisant la documentation Python intégrée pour la fonction (essayez
help(json.load)
, ou pour le module entier (essayezhelp(json)
), ou en consultant la documentation de ces fonctions sur http://docs.python.org .la source
Si vous obtenez une erreur python comme celle-ci:
Vous avez probablement empoisonné votre objet accidentellement en écrasant votre objet avec une chaîne.
Comment reproduire cette erreur en python avec quelques lignes de code:
Exécutez-le, qui imprime:
Mais changez le nom du nom de la variable, et cela fonctionne bien:
Cette erreur se produit lorsque vous essayez 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'appeler une méthode que String ne définit pas et commencez à chercher où vous avez empoisonné votre objet.
la source
Ok, c'est un vieux fil mais. J'ai eu le même problème, mon problème était que j'avais utilisé
json.load
au lieu dejson.loads
De cette façon, json n'a aucun problème avec le chargement de tout type de dictionnaire.
Documentation officielle
la source
Vous devez d'abord ouvrir le fichier. Cela ne fonctionne pas:
Mais cela fonctionne:
la source