Re: [Python-es] problema con "regular expression"

2020-08-17 Por tema Alexis Roda
El ? va junto al * que queremos que no sea codicioso:

pattern = re.compile("^(?P(.*?)): (?P(.*))$")

Ponerlo junto al : hace que ese carácter sea opcional.

In [20]: p = re.compile("^(?P(.*)):? (?P(.*))$")

In [21]: l = "hola mundo"

In [22]: m = p.match(l)

In [23]: m.groupdict()
Out[23]: {'type': 'hola', 'value': 'mundo'}




Missatge de Ander Garmendia  del dia dl., 17 d’ag.
2020 a les 16:43:

> Uuups, te he pegado una expresión que está mal. La correcta es esta:
>
> pattern = re.compile("^(?P(.*)):? (?P(.*))$")
>
> Perdona las molestias.
>
> Jose Caballero  igorleak hau idatzi zuen (2020
> abu. 17, al. 16:37):
>
>> no parece:
>>
>> >>> p = re.compile("^(?P(.*)):? (?P([^:]*))$")
>> >>>
>> >>> l = "type: word: foo bar"
>> >>>
>> >>> m = p.match(l)
>> >>> print m.groupdict()
>> {'type': 'type: word: foo', 'value': 'bar'}
>> >>>
>>
>> Pero voy a echar un vistazo a "greedy".
>> Muchas gracias.
>>
>> Jose
>>
>> El lun., 17 ago. 2020 a las 15:25, Ander Garmendia
>> () escribió:
>> >
>> > Hola,
>> >
>> > Las expresiones tipo(. *) son "greedy", esto es se expanden "a todo lo
>> que pillen". Si quieres limitar el match al primer grupo, añade un ? al
>> carácter de corte:
>> >
>> >  pattern = re.compile("^(?P(.*)):? (?P([^:]*))$")
>> >
>> > Si buscas "greedy" en el apartado de la librería "re" en la
>> documentacion oficial, lo explican mucho mejor.
>> >
>> > Un saludo.
>> >
>> > Jose Caballero  igorleak hau idatzi zuen
>> (2020 abu. 17, al. 15:45):
>> >>
>> >> Hola,
>> >>
>> >> tengo una serie de lineas, todas con el mismo formato:
>> >>
>> >> : 
>> >>
>> >> donde  es una sola palabra, y  es una frase.
>> >> Intentaba "parsearlas" con algo como esto:
>> >>
>> >> pattern = re.compile("^(?P(.*)): (?P(.*))$")
>> >> parse = pattern.match(line)
>> >> groups = parse.groupdict()
>> >> print( groups["type"] )
>> >> print( groups["value"] )
>> >>
>> >> Funciona bien, salvo que  incluya el signo de los dos puntos.
>> >> Por ejemplo, para
>> >>
>> >>  one: two: three four
>> >>
>> >> Me devuelve type = "one: two" y value "three four", en lugar de "one"
>> >> y "two: three four" respectivamente.
>> >>
>> >> ?Como arreglo ese pattern para que el primer "lookahead" pare en el
>> primer ":"?
>> >> [Creo que se nota que tengo poca experiencia con regex]
>> >>
>> >> Muchas gracias.
>> >> Un saludo,
>> >> Jose
>> >> ___
>> >> Python-es mailing list
>> >> Python-es@python.org
>> >> https://mail.python.org/mailman/listinfo/python-es
>> >
>> > ___
>> > Python-es mailing list
>> > Python-es@python.org
>> > https://mail.python.org/mailman/listinfo/python-es
>> ___
>> Python-es mailing list
>> Python-es@python.org
>> https://mail.python.org/mailman/listinfo/python-es
>>
> ___
> Python-es mailing list
> Python-es@python.org
> https://mail.python.org/mailman/listinfo/python-es
>
___
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es


Re: [Python-es] problema con "regular expression"

2020-08-17 Por tema Alexis Roda
Otra solución es utilizar expresiones más precisas/restrictivas/específicas.

Para capturar type, dependiendo de los detalles concretos, puedes utilizar
alguna de las expresiones "[^:]*", "[a-zA-Z]*" o "\w*" en lugar de ".*"


Missatge de Jose Caballero  del dia dl., 17 d’ag.
2020 a les 15:44:

> Hola,
>
> tengo una serie de lineas, todas con el mismo formato:
>
> : 
>
> donde  es una sola palabra, y  es una frase.
> Intentaba "parsearlas" con algo como esto:
>
> pattern = re.compile("^(?P(.*)): (?P(.*))$")
> parse = pattern.match(line)
> groups = parse.groupdict()
> print( groups["type"] )
> print( groups["value"] )
>
> Funciona bien, salvo que  incluya el signo de los dos puntos.
> Por ejemplo, para
>
>  one: two: three four
>
> Me devuelve type = "one: two" y value "three four", en lugar de "one"
> y "two: three four" respectivamente.
>
> ?Como arreglo ese pattern para que el primer "lookahead" pare en el primer
> ":"?
> [Creo que se nota que tengo poca experiencia con regex]
>
> Muchas gracias.
> Un saludo,
> Jose
> ___
> Python-es mailing list
> Python-es@python.org
> https://mail.python.org/mailman/listinfo/python-es
>
___
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es


Re: [Python-es] Lio con lista que contiene diccionarios

2020-08-12 Por tema Alexis Roda
Hola,

Si quieres hacerlo con python "puro y duro" solo tienes que iterar sobre la
lista de diccionarios y procesarlos uno a uno. Algo como:

for diccionario in lista_diccionarios:
print(diccionario["nombre"], diccionario["ISBN"])


Dependiendo de lo que quieras hacer te pueden resultar útiles las *list/dict
comprehension,* los generadores y otras cosas. Por ejemplo:

tabla_nombres = [d["nombre"] for d in lista_diccionarios]


Espero que te sirva.


Saludos

Missatge de Javier Perez  del dia dc., 12 d’ag.
2020 a les 13:53:

> Gracias Marc pero descarte hacerlo con Pandas.
>
>
>
>
>
>
> Saludos,
>
> --
> Javier Pérez
> http://es.linkedin.com/in/javierperez1
> http://www.perasalvino.es/
>
>
>
>
> El 12 ago 2020, a las 12:38, Marc Garcia  escribió:
>
> Te puede interesar pandas:
>
> ```
> import pandas
>
> pandas.DataFrame(fondos_coleccion)
> ```
>
> Solo para eso igual es una dependencia demasiado grande (aunque creo que
> ells la manera más rápida). Pero si necesitas filtrar, agrupar, añadir
> columnas, exportar a csv u otros formatos... Te vendrá bien.
>
>
>
> On Wed, 12 Aug 2020, 11:31 Javier Perez, 
> wrote:
>
>> Buenos días a todos,
>>
>>
>> Perdonar, es una consulta tonta pero no me aclaro.
>>
>> Veamos: Tengo una lista que contiene a 19 diccionarios. Todos con el
>> mismo esquema. O sea que podría ser una tabla.
>>
>> La duda me surge a la hora de mostrar de todos los diccionarios el valor
>> de algunas claves.
>>
>> Os pongo solo dos a modo de ejemplo:
>> print(fondos_coleccion)
>> [{'nombre': 'Bankinter Indice Japon, FI', 'ISBN': 'ES0114104039',
>> 'valor_raspado': 683.63}, {'nombre': 'BankinterTecnología R FI', 'ISBN':
>> 'ES0114797030', 'valor_raspado': 689.92}]
>>
>>
>> Lo que me gustaría mostrar es, por ejemplo:
>> Bankinter Indice Japon, F - ES0114104039
>> BankinterTecnología R FI- ES0114797030
>>
>>
>>
>> Muchísimas gracias por la ayuda,
>>
>> --
>> Javier Pérez
>> http://es.linkedin.com/in/javierperez1
>> http://www.perasalvino.es/
>>
>>
>>
>>
>> ___
>> Python-es mailing list
>> Python-es@python.org
>> https://mail.python.org/mailman/listinfo/python-es
>>
> ___
> Python-es mailing list
> Python-es@python.org
> https://mail.python.org/mailman/listinfo/python-es
>
>
> ___
> Python-es mailing list
> Python-es@python.org
> https://mail.python.org/mailman/listinfo/python-es
>
___
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es


Re: [Python-es] Problemas a la hora de recorrer un CVS

2020-07-11 Por tema Alexis Roda
Hola,

El problema es que has agotado los elementos y el reader no tiene nada que
devolver. A efectos prácticos a partir de la segunda vez que ejecutas el
bucle interno no realiza ninguna iteración.

Puedes consultar la documentación del módulo csv para ver si el reader te
permite "rebobinar" y así empezar a leer nuevamente desde el principio.

Otras solución, no muy eficiente, sería mover la creación del reader dentro
del bucle:


fondos_csv = csv.reader(open('fondos.csv'), delimiter=';’)

print("Leyendo fondo: ")
for fondo in fondos_csv:
movimientos_csv = csv.reader(open('movimientos.csv'), delimiter=';')
for movimiento in movimientos_csv:
print("dentro de movimiento")

print("For exterior")


de esta forma en cada iteración del bucle externo se crea un nuevo reader,
posicionado al principio.

Sin conocer exactamente lo que haces no sé si es factible pero
personalmente intentaría hacer algo como esto:

movimientos_csv = csv.reader(open('movimientos.csv'), delimiter=';')

movimientos_dict = {}
for mov in movimientos_csv:
if mov.codigo_fondo not in movimientos_dict:
movimientos_dict[mov.codigo_fondo] = []
movimientos_dict[mov.codigo_fondo].append(mov)

fondos_csv = csv.reader(open('fondos.csv'), delimiter=';’)
for fondo in fondos_csv:

for mov in movivientos_dict.get(i.codigo, ()):

procesar(fondo, mov)


Precarga los movimientos y los clasifica por fondo. Solo recorres la lista
de movimientos una vez (dos en realidad) en lugar de recorrerla entera para
cada fondo. Carga los movimientos en memoria, puede ser problemático si
tienes muchos.


Espero que te sirva.

Saludos

Missatge de Javier Perez  del dia ds., 11 de
jul. 2020 a les 13:31:

> Hola a todos, buenos días,
>
>
> Necesito vuestra ayuda. Llevo una horas y no soy capaz de seguir ni de
> entender donde esta el problema.
>
>
> Tengo dos CSV que los importo y hasta ese punto sin problemas.
>
> Después quiero recorrer uno (“fondos” en mi app). Y para cada linea cada
> línea de “fondos” tiene que recorrer el otro CSV que llamo “movimientos”.
> Si coinciden en el código del isbn empieza a hacer una serie de cálculos.
>
> Bien, pues solo me recorre una vez “movimientos”, la primera.
>
> Os pongo los trozos de código:
> movimientos_csv = csv.reader(open('movimientos.csv'), delimiter=';')
>
> fondos_csv = csv.reader(open('fondos.csv'), delimiter=';’)
>
> print("Leyendo fondo: ")
> for fondo in fondos_csv:
> for movimiento in movimientos_csv:
> print("dentro de movimiento")
>
> print("For exterior")
>
>
>
>
>
> Y esto sale por el terminal:
> dentro de movimiento
> dentro de movimiento
> dentro de movimiento
> dentro de movimiento
> For exterior
> For exterior
> For exterior
> For exterior
> For exterior
> For exterior
> For exterior
> For exterior
> For exterior
> For exterior
> For exterior
>
> Y entiendo que tenia que salir:
> dentro de movimiento
> dentro de movimiento
> dentro de movimiento
> dentro de movimiento
> For exterior
> dentro de movimiento
> dentro de movimiento
> dentro de movimiento
> dentro de movimiento
> For exterior
> dentro de movimiento
> dentro de movimiento
> dentro de movimiento
> dentro de movimiento
> For exterior
> dentro de movimiento
> dentro de movimiento
> dentro de movimiento
> dentro de movimiento
> etc
>
>
>
> Saludos,
>
> --
> Javier Pérez
> http://es.linkedin.com/in/javierperez1
> http://www.perasalvino.es/
>
>
>
>
> ___
> Python-es mailing list
> Python-es@python.org
> https://mail.python.org/mailman/listinfo/python-es
>
___
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es


Re: [Python-es] [Consulta] Sobre keyerror

2020-07-03 Por tema Alexis Roda
Haz este cambio:

print(complete_url)  # <<< añade esta línea
response = requests.get(complete_url)


Copia/pega lo que sale por pantalla.


Missatge de lemarchand8679  del dia dv., 3 de
jul. 2020 a les 19:40:

> Hice como me habían comentado antes, lo de hacer print en x. Lo hice y da
> el erroe de 401 el cual hace referencia a la api_key. Lo revisé y parece
> estar correcta, está validada y todo. Probé generando otra y lo mismo;
> keyerror.
>
>
>
> Enviado desde mi smartphone Samsung Galaxy.
>
>
> ---- Mensaje original 
> De: Alexis Roda 
> Fecha: 3/7/20 11:19 (GMT-03:00)
> A: La lista de python en castellano 
> Asunto: Re: [Python-es] [Consulta] Sobre keyerror
>
> Tiendo a dar demasiada información y perderme en detalles. La parte
> relevante de mi respuesta es cuando digo que el número 404 y la cadena
> "404" comparan como distintos. En Python, si comparas un número (un int) y
> una cadena (un str) el resultado es que siempre son distintos,
> independientemente de su valor. Esto implica que *la rama del else jamás
> se ejecuta*, no importa qué código de respuesta devuelve la API, siempre
> se ejecuta la rama del then. Esto es un problema cuando la respuesta es
> no-OK y no contiene la clave "main".
>
> Lo puedes confirmar fácilmente inspeccionando el valor de x. Si estoy en
> lo cierto verás algo como {"cod": 123, ...} no {"cod": "123",  ...}. La
> confirmación definitiva sería la documentación de la API, la especificación
> del formato de la respuesta.
>
> Con "la forma correcta" quería decir "la forma recomendada". requests
> ofrece mecanismos para hacer lo mismo de forma más sencilla y robusta. Ya
> que se importa se me hace extraño no aprovecharlos.
>
> También te recomiendo que revises la gestión de errores, parece frágil.
> Imagino que si el código de respuesta es distingo de 404 no significa
> necesariamente que la petición ha ido bien. Confirmalo con la documentación
> de la API.
>
>
> Saludos
>
> Missatge de Lemarchand Barker  del dia dv., 3
> de jul. 2020 a les 13:36:
>
>> 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.villalo...@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 + "=sp" + nombre_ciudad
>>>
>>>
>>> al final complete_url vale
>>> http://api.openweathermap.org/data/2.5/weather?q=spappid=API_KEY=spFOO.
>>> Creo que deberia ser algo mas parecido a
>>> http://api.openweathermap.org/data/2.5/weather?q=FOO=API_KEY=sp
>>> .
>>>
>>> Usando requests de forma correcta te quitas problemas:
>>>
>>> url = "http://api.openwe

Re: [Python-es] [Consulta] Sobre keyerror

2020-07-03 Por tema Alexis Roda
Tiendo a dar demasiada información y perderme en detalles. La parte
relevante de mi respuesta es cuando digo que el número 404 y la cadena
"404" comparan como distintos. En Python, si comparas un número (un int) y
una cadena (un str) el resultado es que siempre son distintos,
independientemente de su valor. Esto implica que *la rama del else jamás se
ejecuta*, no importa qué código de respuesta devuelve la API, siempre se
ejecuta la rama del then. Esto es un problema cuando la respuesta es no-OK
y no contiene la clave "main".

Lo puedes confirmar fácilmente inspeccionando el valor de x. Si estoy en lo
cierto verás algo como {"cod": 123, ...} no {"cod": "123",  ...}. La
confirmación definitiva sería la documentación de la API, la especificación
del formato de la respuesta.

Con "la forma correcta" quería decir "la forma recomendada". requests
ofrece mecanismos para hacer lo mismo de forma más sencilla y robusta. Ya
que se importa se me hace extraño no aprovecharlos.

También te recomiendo que revises la gestión de errores, parece frágil.
Imagino que si el código de respuesta es distingo de 404 no significa
necesariamente que la petición ha ido bien. Confirmalo con la documentación
de la API.


Saludos

Missatge de Lemarchand Barker  del dia dv., 3 de
jul. 2020 a les 13:36:

> 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.villalo...@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 + "=sp" + nombre_ciudad
>>
>>
>> al final complete_url vale
>> http://api.openweathermap.org/data/2.5/weather?q=spappid=API_KEY=spFOO.
>> Creo que deberia ser algo mas parecido a
>> http://api.openweathermap.org/data/2.5/weather?q=FOO=API_KEY=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.co

Re: [Python-es] [Consulta] Sobre keyerror

2020-07-03 Por tema Alexis Roda
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 + "=sp" + nombre_ciudad


al final complete_url vale
http://api.openweathermap.org/data/2.5/weather?q=spappid=API_KEY=spFOO.
Creo que deberia ser algo mas parecido a
http://api.openweathermap.org/data/2.5/weather?q=FOO=API_KEY=sp.

Usando requests de forma correcta te quitas problemas:

url = "http://api.openweathermap.org/data/2.5/weather
"
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  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@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 (
>> lemarchand8...@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 + "=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
>>> 
>>> y = x["main"]
>>> KeyError: 'main'
>>>
>>> El código original es este:
>>> Python-find-current-weather-of-any-city-using-openweathermap-api/
>>> 

Re: [Python-es] [Consulta] KeyError: 'main'

2020-07-02 Por tema Alexis Roda
Hola,

En este caso el valor de x no es exactamente como crees que es: esperas que
tenga una clave llamada "main" que aparentemente no tiene (dispara una
excepción KeyError cuando intentas acceder a "main"). Lo que puedes hacer
es averiguar como es realmente el valor almacenado en x.

Lo más sencillo para depurar este tipo de errores es utilizar alguna
variación de esto que tenga sentido en cada caso:

x = response.json()
print(type(x))  # esto te permite confirmar si x es realmente del
tipo que esperas
print(list(x.keys()))   # suponiendo que sea un diccionario, esto
te muestra sus claves

print(d)# esto imprime el diccionario


Imagino que al hacer la petición al servidor remoto se produce algún tipo
de error que no tienes en cuenta y el formato de la respuesta es distinto
al esperado.

Dices que has cambiado "main" por "cod", no acabo de verle la lógica parece
bastante arbitrario. Para aprender sería interesante que vieses porque ese
cambio produce el segundo error.


Saludos

Missatge de Lemarchand Barker  del dia dj., 2 de
jul. 2020 a les 16:44:

> Hola, estoy teniendo un inconveniente a la hora de correr un programa.
>
> El código es este:
>
> base_url = "http://api.openweathermap.org/data/2.5/weather?q=;
>
> city_name = input("Ingrese nombre de la ciudad: ")
>
> complete_url = base_url + "appid=" + api_key + "=" + city_name
>
> response = requests.get(complete_url)
>
> x = response.json()
>
> if x["cod"] != "404":
> y = x['main']
> # y = x["cod"]
> current_temperature = y["temp"]
> current_pressure = y["pressure"]
> current_humidiy = y["humidity"]
> z = x["weather"]
> weather_description = z[0]["description"]
>
> print(
> "Temperature (in centigrade unit) = " +
> str(current_temperature) +
> "\n atmospheric pressure (in hPa unit) = " +
> str(current_pressure) +
> "\n humidity (in percentage) = " +
> str(current_humidiy) +
> "\n description = " +
> str(weather_description)
> )
> else:
> print(" Ciudad no encontrada ")
>
> El problema se da cuando intento ingresar una ciudad. Probé con la mía
> Corrientes (Argentina) y me da KeyError, probé con otra localidad y es lo
> mismo.
> La salida es la siguiente:
>
> /usr/bin/python3.8 /home/raiden/Programacion/weather/tiempo.py
> Ingrese nombre de la ciudad: London
> Traceback (most recent call last):
>   File "/home/raiden/Programacion/weather/tiempo.py", line 18, in 
> y = x['main']
> KeyError: 'main'
>
> Leí que generalmente ese error se debe a que no encuentra el path o no
> existe. Probé cambiar en la línea 18 el "main" por "cod" y el error ya es
> otro. Es el siguiente:
>
> /usr/bin/python3.8 /home/raiden/Programacion/weather/tiempo.py
> Ingrese nombre de la ciudad: London
> Traceback (most recent call last):
>   File "/home/raiden/Programacion/weather/tiempo.py", line 20, in 
> current_temperature = y["temp"]
> TypeError: 'int' object is not subscriptable
>
> Asi que por eso comenté la línea como se ve en el código, porque me parece
> que mi problema es con main.
>
> El código original es este:
> Python-find-current-weather-of-any-city-using-openweathermap-api/
> 
>
> Saludos
> ___
> Python-es mailing list
> Python-es@python.org
> https://mail.python.org/mailman/listinfo/python-es
>
___
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es


Re: [Python-es] [Consulta] Ide y PEP8: E402

2020-06-27 Por tema Alexis Roda
El PEP 402 al que enlazas no tiene que ver con el error 402 del *linter*.

En https://www.python.org/dev/peps/pep-0008/#imports encontrarás las
recomendaciones de PEP8 relacionadas con los import. La que te afecta es la
segunda:

*Imports are always put at the top of the file, just after any module
comments and docstrings, and before module globals and constants.*


En tu caso tienes una instrucción no-import  (el require) en medio del
bloque de imports, lo que viola la recomendación anterior, de ahí el error
402. PyCharm solo te informa resaltando el error.



Saludos


Missatge de Lemarchand Barker  del dia ds., 27 de
juny 2020 a les 18:13:

> Que bobeta se me pasó el ide, es PyCharm 2020.1 y si, tiene para silenciar.
> Si, se que el pep8 es la guía de estilo, la leí pero la E402 era la que me
> había costado conseguir. Como mencioné anteriormente, habla sobre los
> módulos: https://www.python.org/dev/peps/pep-0402/
>
> Si bien el resaltado no me molesta ni afecta al funcionamiento del
> programa, es más que nada para entender, o tal vez es algo de la
> configuración del ide.
>
> Kivy es una biblioteca de Python y se usa para crear aplicaciones móviles
> y de escritorio. Quiero probar para escritorio algo simple como una
> calculadora, como para ir aprendiendo un poco más. Me pasé a esta porque
> Tkinter mucho de apariencia no me gusta y Qt5 puede que lo vuelva a ver
> mucho más adelante.
> Gracias
>
> El sáb., 27 de jun. de 2020 12:55, Alexis Roda <
> alexis.roda.villalo...@gmail.com> escribió:
>
>> Hola,
>>
>> PEP8 es una guía de estilo. Puedes seguir aquellas recomendaciones que
>> tengan sentido en tu proyecto e ignorar el resto.
>>
>> No conozco kivy, pero me da la sensación que no es posible mover los
>> import antes del require. Por tanto en tu caso puedes ignorar este error.
>>
>> No dices que IDE utilizas, es posible te permita silenciar
>> cierto errores. Busca en su configuración algo relacionado con la
>> configuración del *linter* o del análisis estático del código.
>>
>> También puedes probar añadiendo un comentario # NOQA al final de la
>> línea:
>>
>> from kivy.app import App  # NOQA
>>
>> esto indica al *linter* que ignore las violaciones de PEP8 en esta línea.
>>
>> Posiblemente tu IDE delegue la tarea de verificar el cumplimiento de PEP8
>> en una herramienta externa, como por ejemplo pycodestyle o flake8. En
>> estos enlace encontrarás su documentación:
>>
>> https://pycodestyle.pycqa.org/en/latest/
>> https://flake8.pycqa.org/en/latest/
>>
>> Entre otras cosas documentan los códigos de error y cómo configurarlas
>> para ignorar ciertos tipos de errores.
>>
>>
>>
>> Saludos
>>
>>
>> Missatge de Lemarchand Barker  del dia ds., 27
>> de juny 2020 a les 17:08:
>>
>>> Hola chicos, en el ide como bien dice el título me figura E402 module
>>> level import not at top of file. Si bien no es un error y ejecuta sin
>>> problemas, estuve un montón para encontrar el E402 y habla de los módulos,
>>> la verdad no se cómo hacer para que deje de resaltar.
>>> Les adjunto una imagen para que vean.
>>> Gracias
>>> ___
>>> Python-es mailing list
>>> Python-es@python.org
>>> https://mail.python.org/mailman/listinfo/python-es
>>>
>> ___
>> Python-es mailing list
>> Python-es@python.org
>> https://mail.python.org/mailman/listinfo/python-es
>>
> ___
> Python-es mailing list
> Python-es@python.org
> https://mail.python.org/mailman/listinfo/python-es
>
___
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es


Re: [Python-es] [Consulta] Ide y PEP8: E402

2020-06-27 Por tema Alexis Roda
Hola,

PEP8 es una guía de estilo. Puedes seguir aquellas recomendaciones que
tengan sentido en tu proyecto e ignorar el resto.

No conozco kivy, pero me da la sensación que no es posible mover los import
antes del require. Por tanto en tu caso puedes ignorar este error.

No dices que IDE utilizas, es posible te permita silenciar cierto errores.
Busca en su configuración algo relacionado con la configuración del *linter*
o del análisis estático del código.

También puedes probar añadiendo un comentario # NOQA al final de la línea:

from kivy.app import App  # NOQA

esto indica al *linter* que ignore las violaciones de PEP8 en esta línea.

Posiblemente tu IDE delegue la tarea de verificar el cumplimiento de PEP8
en una herramienta externa, como por ejemplo pycodestyle o flake8. En estos
enlace encontrarás su documentación:

https://pycodestyle.pycqa.org/en/latest/
https://flake8.pycqa.org/en/latest/

Entre otras cosas documentan los códigos de error y cómo configurarlas para
ignorar ciertos tipos de errores.



Saludos


Missatge de Lemarchand Barker  del dia ds., 27 de
juny 2020 a les 17:08:

> Hola chicos, en el ide como bien dice el título me figura E402 module
> level import not at top of file. Si bien no es un error y ejecuta sin
> problemas, estuve un montón para encontrar el E402 y habla de los módulos,
> la verdad no se cómo hacer para que deje de resaltar.
> Les adjunto una imagen para que vean.
> Gracias
> ___
> Python-es mailing list
> Python-es@python.org
> https://mail.python.org/mailman/listinfo/python-es
>
___
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es


Re: [Python-es] Transferencia archivos grandes en socket

2019-04-22 Por tema Alexis Roda
Hola,
¿sigue igual después de hacer que cambios al código?

Antes de que se inventara HTTP se transferían archivos, así que sí, es
viable transferir con sockets a pelo. DiegoUG habla de web sockets, pero
son una bestia totalmente distinta de los sockets.

¿Es HTTP una opción viable? depende del caso de uso.

Prueba con estos cambios en el cliente:

while len(buf) < filesize:
to_read = filesize - len(buf)
buf = socket_cliente.recv(262144 if to_read >
262144 else to_read)  #8192 1024*8 o 4096 1024*4
f.write(buf)
updt(filesize, len(buf))  # barra de progreso
# f.write(buf)

De esta forma solo se mantiene en memoria un bloque, no el archivo entero.
___
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es


Re: [Python-es] Transferencia archivos grandes en socket

2019-04-22 Por tema Alexis Roda
Hola,
tal vez el problema es que guardas en memoria el archivo, en una cadena.
Las cadenas son inmutables, eso significa que la linea "buf +=
socket_cliente(...)" hace algo parecido a:

- reserva un nuevo bloque de memoria
- copia el valor original de buf
- copia el valor devuelto por la función

eso en cada iteración. No escala bien. Si además el archivo es grande, en
comparación con la RAM del equipo, puede ocasionar el uso de la memoria de
intercambio y ralentizar las cosas aún mas.

Prueba grabando en disco cada bloque según le recibes en lugar de esperar a
tenerlos todos y guardar al final.


Missatge de PeRy  del dia dl., 22 d’abr. 2019 a les 2:50:

>
> Buenas! Estoy aprendiendo Python y estoy con el tema de los sockets, he
> creado un servidor y cliente para enviar archivos. Me he dado cuenta que en
> archivos grandes cuanto mas pasa el tiempo mas lenta se hace la recepción
> de la información, ¿alguna sugerencia por qué pasa y como se podría evitar?
> mi codigo:
>
> server:
>
> =
> elif b'\F' in data: # peticion de archivo para ser descargado
> transmitido = data.rstrip(b'\F')
> comparte_dir = os.path.join(os.getcwd(), 'compartir')
> print(os.path.join(comparte_dir, transmitido.decode()))
> filesize = os.path.getsize(os.path.join(comparte_dir,
> transmitido.decode()))
> print("TAMAÑO: {}".format(filesize))
> with open(os.path.join(comparte_dir, transmitido.decode()), 'rb') as f:
> self.socket.send(struct.pack('!I', filesize))  # enviamos en los primeros
> 4bytes el tamaño del archivo
> numero_bytes = self.socket.sendfile(f)
> # data = f.read(8192)
> # numero_bytes = len(data)
> # self.socket.send(data)
> # while data:
> # data = f.read(8192)
> # self.socket.send(data)
> # numero_bytes += len(data)
> print(numero_bytes)
>
> cliente:
>
> ===
> with open(archivo, 'wb') as f:
> buf = socket_cliente.recv(4)  # cabecera con elt
> amaño del archivo
> filesize = struct.unpack('!I', buf)
> print("filesize : {}".format(filesize))
> filesize=filesize[0]
> buf = b''
> tiempo_inicio = datetime.datetime.now()
> print(tiempo_inicio.strftime('%H:%M:%S'))
> while len(buf) < filesize:
> to_read = filesize - len(buf)
> buf += socket_cliente.recv(262144 if to_read >
> 262144 else to_read)  #8192 1024*8 o 4096 1024*4
> updt(filesize, len(buf))  # barra de progreso
> f.write(buf)
>
> -
> Muchas Gracias y un saludo
>
> ___
> Python-es mailing list
> Python-es@python.org
> https://mail.python.org/mailman/listinfo/python-es
>
___
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es


Re: [Python-es] Manejo de Vectores y Matrices

2013-04-01 Por tema Alexis Roda

Al 01/04/13 15:39, En/na Stalin Bello ha escrit:

Buenos dias, estoy estudiando calculo numerico y especificamente algebra
lineal, me gustaria implementar los algoritmos de Gauss-Sidell en python
pero para esto tengo que implementar vectores y matrices, no se como
hacerlo. Agradeceria cualquier ayuda.


En python un vector se puede representar mediante una lista o tupla:

v1 = [1, 2, 3]
v2 = (1, 2, 3)

y una matriz mediante una lista de listas:

m = [
  [ 1, 2, 3],
  [ 4, 5, 6]
]

for fila in m:
for item in n:
print item

print m[0][1]

Pero estas estructuras no resultan especialmente eficientes para cálculo 
numérico.


La recomendación estándar en estos casos suele ser NumPy.



Saludos

___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] limitar caracteres en random

2013-04-01 Por tema Alexis Roda

Al 01/04/13 19:38, En/na gustavo.hernan...@etecsa.cu ha escrit:


Saludos a la lista:

Estoy trabajando con la generación de cadenas aleatorias con caracteres
alfanuméricos, usando random, mi pregunta Cómo restringir que determinados
caracteres no sean incluidos, por ejemplo el 0 y la O


random.choice(abc123)



Saludos

___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Presentación y duda con módulo re

2013-04-01 Por tema Alexis Roda

Al 02/04/13 00:30, En/na Javier Alonso ha escrit:

Estoy atascado con las regexp. De momento quiero separar cada elemento
de la siguiente cadena @   IN  SOA ns1.nameserverprimario.com
http://ns1.nameserverprimario.com. admin.dominio.com
http://admin.dominio.com.

grupos =
re.match('^([@]|[a-zA-z0-9\.]*\.)(\s+)IN(\s+)SOA(\s+)([@]|[a-zA-z0-9\.]*\.)(\s+)([@]|[a-zA-z0-9\.]*\.)','@
   IN  SOA http://ns1.nameserverprimario.com. admin.dominio.com.')
print(grupos.group())


([@]|[a-zA-z0-9\.]*\.) no encaja con http://ns1.nameserverprimario.com.

Me ha costado verlo. El thunderbird ha convertido la URL en un enlace y 
claro, al copiar/pegar en el interprete no se incluía el http:// y 
funcionaba. Mejor envía mensajes con texto plano.




Saludos

___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] tienen algun algoritmo de suma de comprobacion

2013-01-03 Por tema Alexis Roda

Al 03/01/13 06:32, En/na xiao xiong mao panda rojo ha escrit:


 
  Te refieres a que quieres el algoritmo? solo mira en la wikipedia
  https://en.wikipedia.org/wiki/Md5
 
  Y si quieres una mplementación, pues Rosetta tiene cientos
  http://rosettacode.org/wiki/MD5/Implementation
 

muchas gracias carlos.zun. ahora veo por k no encontraba ningún ejemplo
apenas lo he visto y parece bastante complicado
sera peor aun con vhdl
parece k con md5 no podra ser. tendré k buscar algo mas simple.
igualmente muchas gracias


Tal vez http://en.wikipedia.org/wiki/Cyclic_redundancy_check


___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Como hacer una aproximación numérica?

2012-08-09 Por tema Alexis Roda

Al 09/08/12 23:12, En/na Diego Uribe Gamez ha escrit:


Estoy trabajando con grados y la idea es aproximar cualquier numero que
entre a la formula, aproximar entre estos:

0,15,30,45,60,75,90,105,120,135,150,165,180,210,225,240,255,270

otro ejemplo seria a = 104.5 y la idea seria que lo aproximara al min 90
o al max 105 yo se que es lógico que se aproxime a 105 pero la idea es
que lo haga el código en python de forma simple.

Alguna idea?


 a = 104.5
 int(a/15) * 15, (int(a/15) + 1) * 15
(90, 105)


Saludos
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Consejos deploy Django

2012-01-20 Por tema Alexis Roda

Al 20/01/12 15:50, En/na Pablo Vieytes ha escrit:

buenas,
por lo que veo mi hilo no ha tenido mucho éxito :(
También es verdad que esta parece una semana movidita


En mi caso la configuración que utilizo es:

* en /usr/local/python/version tengo varias versiones de python 
instaladas.


* un virtualenv por cada proyecto django, ubicado en 
/usr/local/virtualenv/proyecto. Aquí van los paquetes y las aplicaciones.


* cada proyecto tiene un directorio en 
/var/lib/django/instance/proyecto. Dentro de este directorio va el 
project, el contenido estático recopilado con 'manage collecstatic', un 
directorio 'data' si es necesario etc.


* apache + fastcgi

* un script para iniciar/parar los proyectos


El despliegue por el momento lo hago manualmente. Cuando tenga tiempo 
quiero echarle un vistazo a fabric.




Saludos
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Funciones Decoradores

2011-06-22 Por tema Alexis Roda

En/na Manuel A. Estevez Fernandez ha escrit:


Alguien me podría ayudar para poder guardar los parámetros que recibe la 
función que se va a ejecutar,


Si no me equivoco kwargs solamente tomará valor si llamas a la función 
con argumentos con nombre:


In [1]: def prueba(*args, **kw) :
   ...: print args, kw
   ...:
   ...:

In [2]: prueba(1)
(1,) {}

In [3]: prueba(foo=1)
() {'foo': 1}

In [4]: prueba(3,foo=1)
(3,) {'foo': 1}

y ademas la funcion get_informacion, 
dentro de su funcionamiento manda a llamar a la funcion 
get_query_statement y esta no se registra en el log ¿por qué?


El problema es que get_informacion no llega a ejecutarse. En el 
decorador te limitas a registrar la llamada en el log, pero no llamas a 
la función decorada.





Saludos

___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Detectar una tecla

2011-06-20 Por tema Alexis Roda

En/na Douglas Jiménez ha escrit:
Quizás si explico lo que quiero hacer se les puede hacer más fácil 
orientarme. Quiero escribir algo parecido a la instrucción input para un 
niño de tres años. Él se sabe todas las letras del alfabeto, pero no 
sabe leer (por supuesto). La idea es hacer que vaya escribiendo letras 
en secuencia, dirigido por un adulto, hasta que tenga una palabra, luego 
de lo cual al presionar Enter pasará algo relacionado con el 
significado de la palabra (lo cual sé programar).


Las letras se le aparecerán en un formato grande y en una ventana 
ad-hoc, donde sucederá el evento ya comentado. Por eso necesito una 
rutina que se quede esperando la letra para luego ponerla en cierto 
lugar de la ventana. La palabra, por supuesto, la formo por 
concatenación de las letras.


Échale un vistazo a pygame (http://pygame.org), tal vez te sirva.




Saludos
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Buscar, leer y escribir archivos grandes con Python

2011-06-03 Por tema Alexis Roda

En/na Kiko ha escrit:

En el programa que mandaste en el primer mensaje parece implícito que la 
longitud del código es siempre de 9 caracteres. Esto hace innecesario el 
uso de rsplit o rfind.


def procesa(entrada, salida) :
with open(entrada,'r') as input:
with open(salida,'w') as output:
for l in input :
output.write(l[-9:])

In [1]: l = 1|2011-05-20 23:08:56|122711527|OPERADOR1|HOST 
TOHOST|212454|1|HOST CLIENTE|192630167


In [2]: timeit l.rsplit(|, 1)[-1]
100 loops, best of 3: 827 ns per loop

In [3]: timeit l[l.rindex(|)+1:]
100 loops, best of 3: 676 ns per loop

In [4]: timeit l[l.rfind(|)+1:]
100 loops, best of 3: 682 ns per loop

In [5]: timeit l[-9:]
100 loops, best of 3: 208 ns per loop

Fíjate en que utilizar rfind (o rindex) como hacías originalmente es mas 
eficiente que utilizar rsplit. La explicación es que rsplit crea dos 
cadenas (la mitad izquierda y la derecha), una lista con las dos 
cadenas y finalmente accede al último elemento de la lista. En la 
versión con rindex se crea directamente la cadena derecha.


Como curiosidad, en el caso de utilizar un método de l podrías arañar 
unos nanosegundos haciendo algo como:


In [6]: rf=l.rfind

In [7]: timeit l[rf(|)+1:]
100 loops, best of 3: 602 ns per loop

con esto evitas que el interprete tenga que buscar el método rfind de l 
en cada iteración.



Claramente, rsplit parece que funciona mejor.  He hecho mi función
(abrekiko) con una list comprehesion y también va un poquito más lenta 
que con el for a pelo y tenía entendido que usar list comprehensions era 
más efectivo.


Las list comprehension sirven para crear listas. Lo que hace tu código 
es equivalente a:


def abrelasi(entrada,salida):
lista = []
with open(entrada,'r') as input:
with open(salida,'w') as output:
for l in input :
lista.append(output.write(l.rsplit(',',1)[-1]))

Al final lista contiene 30 valores None. No le veo el sentido.


¿Alguien tiene formas más rápidas de lectura de ficheros de texto?


Yo hubiese utilizado cut -d\| -f9 entrada.txt  salida.txt

Como ya te han dicho debes considerar el tiempo de desarrollo mas el 
tiempo de ejecución y valorar si el esfuerzo extra vale la pena. Dicho 
esto, si quieres aprender, te recomendaría probar el módulo cProfile:


  http://docs.python.org/library/profile.html#module-cProfile

este modulo mide el tiempo de ejecución del programa y te ayudará a 
descubrir donde está el cuello de botella. Tal vez estés dedicando horas 
a optimizar algo que luego no tiene un impacto decisivo en el tiempo 
total de ejecución.


En el caso de procesar el archivo tengo la impresión de que el problema 
estará en la E/S y no el el procesamiento de los datos en si (utilizando 
un programa razonable).




Saludos
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Equivalente a __missing__ para el setter

2010-10-11 Por tema Alexis Roda

En/na Garito ha escrit:

yDict({a: {b: {c: abc}}}) - {'a': {'b': {'c': 'abc'}}}


Para que yDict funcione todo valor que no sea final debe ser a su vez 
un yDict (es una estructura recursiva). Si pasas una serie de 
diccionarios anidados al constructor este no los convierte en yDict.


Para verlo más claro añade el método:

def __repr__(self) :
return yDict {%s} % , .join(
[%r : %r % (k, v) for k, v in self.items()]
)


In [1]: d = yDict({a: {b: {c: abc}}})
In [2]: d
Out[2]: yDict {'a' : {'b': {'c': 'abc'}}}
In [3]: dd = yDict()
In [4]: dd[a/b/c] = abc
In [5]: dd
Out[5]: yDict {'a' : yDict {'b' : yDict {'c' : 'abc'}}}

En [2] los diccionarios interiores no son instancias de yDict, en [5] 
sí. Deberás redefinir '__init__' para que la instancia se inicialice 
correctamente. También deberás redefinir el método 'setdefault' y 
posiblemente otros para garantizar que la semántica de yDict sea 
consistente.






Saludos
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Equivalente a __missing__ para el setter

2010-10-09 Por tema Alexis Roda

En/na Garito ha escrit:

Me gustaria que el acceso a estas funciones sea recursivo


¿ por algún motivo en especial ?

 La pregunta seria: hay alguna forma de cambiarle el tipo
 (momentaneamente) sin crear otro objeto? O dicho de otra forma: puedo
 hacer un cast momentaneo?

Creo que lo que buscas es 'super':

class yDict(dict) :
def __getitem__(self, clave):
partes = clave.split('/', 1)
if len(partes)  1 :
return super(yDict, self).__getitem__(partes[0])[partes[1]]
else:
return super(yDict, self).__getitem__(partes[0])

def __setitem__(self, clave, valor) :
partes = clave.split(/, 1)
if len(partes)  1 :
super(yDict, self).setdefault(partes[0], 
yDict())[partes[1]] = valor

else :
super(yDict, self).__setitem__(partes[0], valor)

¿Que debería ocurrir con este código?

d = yDict()
d[a/b] = 1
d[a/b/c] = 2



Saludos
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/