[Python-es] [Consulta] Sobre keyerror

Lemarchand Barker lemarchand8679 en gmail.com
Vie Jul 3 08:04:31 EDT 2020


Por o visto no fuí la única con el problema de main

El vie., 3 jul. 2020 a las 8:36, Lemarchand Barker (<
lemarchand8679 en gmail.com>) escribió:

> Buenas gracias a todos por sus aportes. Si, me llamo Verónica.
> En respuesta a Alexis, puede ser una forma incorrecta de realizar la
> consulta pero cuando hice copy-paste, al probar con distintas localidades
> funcionó. Tengo que mirar la info para desarrolladores que tiene más
> detenidamente, no es larga.
> Yo al 404 lo entiendo como el de page not found, de ahí que el else te
> diga que no encontró la ciudad. No encuentra la página con la información
> de esa localidad.
>
>
>
> El vie., 3 de jul. de 2020 04:33, Alexis Roda <
> alexis.roda.villalonga en gmail.com> escribió:
>
>> Si python dice "KeyError: main" al ejecutar y = x["main"] es que x no
>> tiene la clave "main". Averigua el valor de x, tal vez te dé una pista del
>> problema.
>>
>> En el otro mensaje, al cambiar "main" por "cod" el error era "int value
>> is not subscriptable" (o algo parecido), eso nos dice que el valor asociado
>> a la clave "cod" es un número (habría que confirmarlo con la documentación
>> de la API) pero el programa lo trata como una cadena (en el if x["cod"]
>> != "404"). El número 404 y la cadena "404" comparan como distintos. No
>> sé si tiene que ver con el KeyError main pero es un error que habría que
>> corregir. Relacionado con esto, no parece buena idea asumir que si el
>> código es distinto de 404 la petición ha ido bien. Asumiendo que sean
>> códigos HTTP yo haría algo como: si cod == 200 procesamiento ok sino si
>> cod == 404 imprime "no encontrado" ... sino imprime "error desconocido".
>>
>> Me llama la atención que el script utilice el paquete requests para luego
>> acabar construyendo la URL a mano. Por otro lado la URL que construye no
>> parece muy correcta. Suponiendo que nombre_ciudad sea FOO:
>>
>> url = "http://api.openweathermap.org/data/2.5/weather?q=sp"
>> complete_url = url + "appid=" + api_key + "&q=sp" + nombre_ciudad
>>
>>
>> al final complete_url vale
>> http://api.openweathermap.org/data/2.5/weather?q=spappid=API_KEY&q=spFOO.
>> Creo que deberia ser algo mas parecido a
>> http://api.openweathermap.org/data/2.5/weather?q=FOO&appid=API_KEY&lang=sp
>> .
>>
>> Usando requests de forma correcta te quitas problemas:
>>
>> url = "http://api.openweathermap.org/data/2.5/weather
>> <http://api.openweathermap.org/data/2.5/weather?q=sp>"
>> response = requests.get(url, data={"q": nombre_ciudad, "lang": "sp",
>> "appid": api_key})
>>
>>
>> añadirá el ? y los & donde corresponda, codificará correctamente los
>> valores y no quedarán valores "desparejados" ni claves duplicadas.
>>
>> Visto todo esto sigo pensando que el problema es una mala petición a la
>> API que devuelve un código de error que no es gestionado correctamente.
>>
>> Respecto a que el problema se produzca cuando escribes el programa a mano
>> y que funciona si copias/pegas. En caso que no sea un error evidente en la
>> transcripción y que el valor de x no te dé ninguna pista, los IDE suelen
>> incluir alguna herramienta para comparar archivos. Comparalos y encuentra
>> que los hace diferentes y puede causar el problema.
>>
>> https://www.jetbrains.com/help/pycharm/comparing-files-and-folders.html
>>
>> Creo que es excesivo para este problema pero es otra herramienta que
>> puede ser útil.
>>
>>
>> Saludos
>>
>> Missatge de Lemarchand Barker <lemarchand8679 en gmail.com> del dia dv., 3
>> de jul. 2020 a les 1:22:
>>
>>> Hola, el código de api key funciona, porque me registré y lo usé y
>>> funcionó.
>>> Lo de sp fue más que nada para probar, corresponde al Multilingual
>>> support. Incluso cuando hice copy-paste del código sin usar el sp,
>>> funcionaba perfecto. Lo saqué de acá: https://openweathermap.org/current.
>>> Lo del multilingual está ya casi al final de la página.
>>> La url que uso es esta: api.openweathermap.org/data/2.5/weather? que es
>>> la misma que figura en la página. Reitero, el problema me salta cada vez
>>> que copio el código de forma manual, con copy-paste ningún problema.
>>> Saludos
>>>
>>> El jue., 2 jul. 2020 a las 20:00, David Suárez vía Python-es (<
>>> python-es en python.org>) escribió:
>>>
>>>> Vero,
>>>>
>>>> el problema que veo es que tienes la cadena "sp" de sobra tanto en la
>>>> variable url como cuando generas complete_url y creo que no deberían ir
>>>> allí, aunque no he podido checarlo por lo de la llave API.
>>>>
>>>> El jue., 2 de jul. de 2020 a la(s) 17:30, Lemarchand Barker (
>>>> lemarchand8679 en gmail.com) escribió:
>>>>
>>>>> Hola, este es mi código:
>>>>>
>>>>> import requests
>>>>> import json
>>>>>
>>>>> api_key = "API_KEY"
>>>>>
>>>>> url = "http://api.openweathermap.org/data/2.5/weather?q=sp"
>>>>>
>>>>> nombre_ciudad = input("Ingrese nombre de la ciudad: ")
>>>>>
>>>>> complete_url = url + "appid=" + api_key + "&q=sp" + nombre_ciudad
>>>>>
>>>>> response = requests.get(complete_url)
>>>>>
>>>>> x = response.json()
>>>>>
>>>>> if x["cod"] != "404":
>>>>>
>>>>>     y = x["main"]
>>>>>
>>>>>     temperatura_actual = y["temp"]
>>>>>
>>>>>     celsius = temperatura_actual - 273.15
>>>>>
>>>>>     presion_actual = y["pressure"]
>>>>>
>>>>>     humedad_actual = y["humidity"]
>>>>>
>>>>>     z = x["clima"]
>>>>>
>>>>>     descripcion = z[0]["descripcion"]
>>>>>
>>>>>     print(f"Temperatura: {celsius}°")
>>>>>     print(f"Presión atmosférica: {presion_actual} hPa")
>>>>>     print(f"Humedad: {humedad_actual} %")
>>>>>     print(f"Descripción: {descripcion}")
>>>>>
>>>>> else:
>>>>>     print("Ciudad no encontrada")
>>>>>
>>>>> La salida es la siguiente:
>>>>>
>>>>> /usr/bin/python3.8 /home/raiden/Programacion/weather/weather.py
>>>>> Ingrese nombre de la ciudad: Rosario
>>>>> Traceback (most recent call last):
>>>>>   File "/home/raiden/Programacion/weather/weather.py", line 18, in
>>>>> <module>
>>>>>     y = x["main"]
>>>>> KeyError: 'main'
>>>>>
>>>>> El código original es este:
>>>>> Python-find-current-weather-of-any-city-using-openweathermap-api/
>>>>> <https://www.geeksforgeeks.org/python-find-current-weather-of-any-city-using-openweathermap-api/>
>>>>>
>>>>> Saludos y gracias
>>>>>
>>>>>
>>>>> El jue., 2 jul. 2020 a las 18:20, Gerardo Diez (<
>>>>> gerardo.diez.garcia en gmail.com>) escribió:
>>>>> >
>>>>> > Hola,
>>>>> >
>>>>> > No soy precisamente un experto, pero yo normalmente voy poniendo
>>>>> prints /liga por todos lados para que me vaya mostrando el contenido de las
>>>>> cadenas.
>>>>> >
>>>>> > No recuerdo muy bien el funcionamiento de input pero puede ser que
>>>>> el string que se esté incorporando lleve un salto de línea final ( \n)?
>>>>> >
>>>>> > Si es así mira la función strip
>>>>> >
>>>>> > Un saludo
>>>>> >
>>>>> > El jue., 2 jul. 2020 22:01, lemarchand8679 <lemarchand8679 en gmail.com>
>>>>> escribió:
>>>>> >>
>>>>> >> Hola, había escrito para comentar que había solucionado el
>>>>> inconveniente de KeyError, y es cierto en parte. Digo en parte porque si
>>>>> escribo desde 0 para hacer algunas modificaciones, me tira ese error al
>>>>> introducir una ciudad, y si hago un copy-paste del código funciona y la
>>>>> verdad no se por qué, alguna idea? Gracias
>>>>> >>
>>>>> >>
>>>>> >>
>>>>> >> Enviado desde mi smartphone Samsung Galaxy.
>>>>> >>
>>>>> >> _______________________________________________
>>>>> >> Python-es mailing list
>>>>> >> Python-es en python.org
>>>>> >> https://mail.python.org/mailman/listinfo/python-es
>>>>> >
>>>>> > _______________________________________________
>>>>> > Python-es mailing list
>>>>> > Python-es en python.org
>>>>> > https://mail.python.org/mailman/listinfo/python-es
>>>>> _______________________________________________
>>>>> Python-es mailing list
>>>>> Python-es en python.org
>>>>> https://mail.python.org/mailman/listinfo/python-es
>>>>>
>>>> _______________________________________________
>>>> Python-es mailing list
>>>> Python-es en python.org
>>>> https://mail.python.org/mailman/listinfo/python-es
>>>>
>>> _______________________________________________
>>> Python-es mailing list
>>> Python-es en python.org
>>> https://mail.python.org/mailman/listinfo/python-es
>>>
>> _______________________________________________
>> Python-es mailing list
>> Python-es en python.org
>> https://mail.python.org/mailman/listinfo/python-es
>>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20200703/61e69166/attachment.html>
------------ próxima parte ------------
Se ha borrado un mensaje adjunto que no está en formato texto plano...
Nombre     : error.png
Tipo       : image/png
Tamaño     : 75710 bytes
Descripción: no disponible
Url        : <http://mail.python.org/pipermail/python-es/attachments/20200703/61e69166/attachment.png>


Más información sobre la lista de distribución Python-es