En Python obtengo un error:
Exception: (<type 'exceptions.AttributeError'>,
AttributeError("'str' object has no attribute 'read'",), <traceback object at 0x1543ab8>)
Código de Python dado:
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?
python
python-2.7
urllib2
attributeerror
RobinJ
fuente
fuente
jsonofabitch
nombre de la variable.Respuestas:
El problema es que
json.load
debe pasar un archivo como objeto con unaread
función definida. Entonces, o usasjson.load(response)
ojson.loads(response.read())
.fuente
json.load()
toma un archivo como objeto con unread()
método,json.loads()
toma una cadena. Es fácil pasar por alto la "s" al final y pensar que son el mismo método.open
usted puede lograr eso.s
significa "cadena". Estoy de acuerdo en que la biblioteca estándar tiene algunos problemas serios en general con la forma en que se nombran las cosas, y este es un buen ejemplo de cómo se complica.Esto significa exactamente lo que dice: algo intentó encontrar un
.read
atributo en el objeto que le dio, y le dio un objeto de tipostr
(es decir, le dio una cadena).El error ocurrió aquí:
Bueno, no está buscando
read
ningún lugar, por lo que debe suceder en lajson.load
función que llamó (como lo indica el rastreo completo). Eso es porquejson.load
está intentando.read
lo que le diste, pero lo distejsonofabitch
, que actualmente nombra una cadena (que creaste llamando.read
alresponse
).Solución: no te llames a
.read
ti mismo; la función hará esto, y espera que le des elresponse
directamente para que pueda hacerlo.También podría haber descubierto esto leyendo la documentación de Python incorporada para la función (try
help(json.load)
, o para todo el módulo (tryhelp(json)
), o comprobando la documentación de esas funciones en http://docs.python.org .fuente
Si obtiene un error de Python como este:
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:
Ejecútelo, que imprime:
Pero cambie el nombre del variablename y funciona bien:
Este error se produce cuando intentaste ejecutar un método dentro de una cadena. La cadena tiene algunos métodos, pero no el que estás invocando. Así que deja de intentar invocar un método que String no define y comienza a buscar dónde envenenaste tu objeto.
fuente
Ok, este es un hilo viejo pero. Tuve el mismo problema, mi problema fue que usé en
json.load
lugar dejson.loads
De esta manera, json no tiene problemas para cargar ningún tipo de diccionario.
Documentación oficial
fuente
Primero debes abrir el archivo. Esto no funciona:
Pero esto funciona:
fuente