AttributeError(“El objeto ‘str’ no tiene el atributo ‘leer'”)

5 minutos de lectura

avatar de usuario
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?

avatar de usuario
mutantaculo

El problema es que para json.load debe pasar un archivo como objeto con un read función definida. Así que 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 un read() 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 vez de json.loads

De esta manera, json no tiene problemas para cargar cualquier tipo de diccionario.

Documentación oficial

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.

avatar de usuario
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.

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 (jsonofabitch)['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 jsonofabitchque 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 .

  • Así lo llamó OP. Siempre estoy indeciso sobre si cambiar o conservar dichos nombres de identificación cuando ayudo a otros. :/

    – Karl Knechtel

    24 de noviembre de 2019 a las 18:23

  • Oh, tienes razón, lo he hojeado… aunque no me quejaba 🙂

    – Andrea Ligios

    25 de noviembre de 2019 a las 8:17

avatar de usuario
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)

  • Así lo llamó OP. Siempre estoy indeciso sobre si cambiar o conservar dichos nombres de identificación cuando ayudo a otros. :/

    – Karl Knechtel

    24 de noviembre de 2019 a las 18:23

  • Oh, tienes razón, lo he hojeado… aunque no me quejaba 🙂

    – Andrea Ligios

    25 de noviembre de 2019 a las 8:17

avatar de usuario
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']

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad