python - framework - tutorial django
AttributeError(el objeto "str" no tiene atributo "leer") (3)
El problema es que para json.load
debe pasar un archivo como objeto con una función de read
definida. Entonces, o bien usa json.load(reponse)
o json.loads(response.read())
.
En Python recibo un error:
Exception: (<type ''exceptions.AttributeError''>,
AttributeError("''str'' object has no attribute ''read''",), <traceback object at 0x1543ab8>)
Dado el código 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'']
¿Qué significa este error y qué hice para causarlo?
Si obtiene un error de Python como este:
AttributeError: ''str'' object has no attribute ''some_method''
Probablemente envenenó su objeto accidentalmente sobrescribiendo su objeto con una cadena.
Cómo reproducir este error en python con algunas líneas de código:
#!/usr/bin/env python
import json
def foobar(json):
msg = json.loads(json)
foobar(''{"batman": "yes"}'')
Ejecútelo, que imprime:
AttributeError: ''str'' object has no attribute ''loads''
Pero cambie el nombre de la variable y funciona bien:
#!/usr/bin/env python
import json
def foobar(jsonstring):
msg = json.loads(jsonstring)
foobar(''{"batman": "yes"}'')
Este error se produce cuando intentas ejecutar un método dentro de una cadena. String tiene algunos métodos, pero no el que está invocando. Así que deja de intentar invocar un método que String no define y comienza a buscar dónde envenenaste tu objeto.
AttributeError("''str'' object has no attribute ''read''",)
Esto significa exactamente lo que dice: algo intentó encontrar un atributo .read
en el objeto que le diste, y le diste un objeto de tipo str
(es decir, le diste una cadena).
El error ocurrió aquí:
json.load (jsonofabitch)[''data''][''children'']
Bueno, no está buscando read
ninguna parte, por lo que debe suceder en la función json.load
que llamó (como lo indica el rastreo completo). Eso es porque json.load
está tratando de .read
lo que le diste, pero le diste jsonofabitch
, que actualmente nombra una cadena (que creaste al invocar .read
en la response
).
Solución: no llame a .read
usted mismo; la función hará esto y espera que le des la response
directamente para que pueda hacerlo.
También podría haberse dado cuenta leyendo la documentación incorporada de Python para la función (pruebe la help(json.load)
, o para todo el módulo (pruebe la help(json)
), o revisando la documentación de esas funciones en http : //docs.python.org .