RobinJ
En Python recibo un error:
Exception: (<type 'exceptions.AttributeError'>,
AttributeError("'str' object has no attribute 'read'",), <traceback object at 0x1543ab8>)
Dado el código de 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)
jsonStr = response.read()
return json.load(jsonStr)['data']['children']
¿Qué significa este error y qué hice para causarlo?
mutantaculo
El problema es que para json.load
debe pasar un archivo como objeto con un read
función definida. Entonces, o usas json.load(response)
o json.loads(response.read())
.
-
No entiendo esto… ¿cómo se resuelve el problema al hacer read()? La respuesta todavía no tiene una función de lectura. ¿Se supone que debemos poner la cadena en algún objeto con una función de lectura?
– zakdanzas
11 de agosto de 2012 a las 9:37
-
@yourfriendzak leyó atentamente, son dos funciones diferentes con nombres muy similares.
json.load()
toma un archivo como objeto con unread()
método,json.loads()
toma una cuerda. Es fácil pasar por alto la “s” al final y pensar que son el mismo método.– Joshmaker
25 de abril de 2013 a las 12:02
-
¡Gracias al comentario de Joshmaker, json.loads() puede analizar cadenas en busca de datos JSON!
-Yu Shen
10 de mayo de 2013 a las 2:43
-
@yourfriendzak Esta respuesta le indicaría que con
open
puedes lograr eso.– jaim
13 de julio de 2014 a las 3:38
-
@MANISHZOPE el
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 estropea.– Karl Knechtel
9 de enero de 2016 a las 20:04
Ok, este es un hilo viejo pero. Tuve el mismo problema, mi problema fue que usé json.load
en lugar de json.loads
De esta manera, json no tiene problemas para cargar cualquier tipo de diccionario.
json.load: deserializa fp (un archivo de texto compatible con .read() o un archivo binario que contiene un documento JSON) en un objeto de Python utilizando esta tabla de conversión.
json.loads: deserializa s (una instancia de str, bytes o bytearray que contiene un documento JSON) en un objeto de Python usando esta tabla de conversión.
música_piano
Primero debe abrir el archivo. Esto no funciona:
json_file = json.load('test.json')
Pero esto funciona:
f = open('test.json')
json_file = json.load(f)
-
Encontré el error en la pregunta al intentar abrir un archivo en lugar de una respuesta de solicitud en la pregunta. Claramente, en el backend, json está tratando a ambos de manera similar, por lo que esta respuesta me ayudó. Claramente vale la pena un voto positivo.
– Nitin Khanna
16 de abril de 2020 a las 19:34
Si obtiene un error de python como este:
AttributeError: 'str' object has no attribute 'some_method'
Probablemente envenenó su objeto accidentalmente al sobrescribir su objeto con una cadena.
Cómo reproducir este error en python con unas pocas 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 variablename, y funciona bien:
#!/usr/bin/env python
import json
def foobar(jsonstring):
msg = json.loads(jsonstring)
foobar('{"batman": "yes"}')
Este error se produce cuando intentó 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.
Carlos Knechtel
AttributeError("'str' object has no attribute 'read'",)
Esto significa exactamente lo que dice: algo trató de encontrar un .read
atributo 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(jsonStr)['data']['children']
Bueno, no estás buscando read
en cualquier lugar, por lo que debe suceder en el json.load
función a la que llamó (como se indica en el rastreo completo). Eso es porque json.load
está tratando de .read
la cosa que le diste, pero te la diste jsonStr
que actualmente nombra una cadena (que creó al llamar .read
sobre el response
).
Solución: no llamar .read
tú mismo; la función hará esto, y espera que le des la response
directamente para que pueda hacerlo.
También podría haber descubierto esto leyendo la documentación integrada de Python para la función (intente help(json.load)
o para todo el módulo (pruebe help(json)
), o consultando la documentación de dichas funciones en http://docs.python.org .
Pallav Ghose
En lugar de json.load() use json.loads() y funcionaría: ex:
import json
from json import dumps
strinjJson = '{"event_type": "affected_element_added"}'
data = json.loads(strinjJson)
print(data)
limón
Entonces, no uses json.load(data.read())
usar json.loads(data.read())
:
def findMailOfDev(fileName):
file=open(fileName,'r')
data=file.read();
data=json.loads(data)
return data['mail']