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

jsonofabitchnombre de la variable.Respuestas:
El problema es que
json.loaddebe pasar un archivo como objeto con unareadfunció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.openusted puede lograr eso.ssignifica "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
.readatributo 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
readningún lugar, por lo que debe suceder en lajson.loadfunción que llamó (como lo indica el rastreo completo). Eso es porquejson.loadestá intentando.readlo que le diste, pero lo distejsonofabitch, que actualmente nombra una cadena (que creaste llamando.readalresponse).Solución: no te llames a
.readti mismo; la función hará esto, y espera que le des elresponsedirectamente 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.loadlugar dejson.loadsDe 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