Muchas gracias a los tres. Ayer se me complico el día y hasta ahora no lo he 
podio probar.

Alejandro lo de sacarlo a una función no funciono.

Alexis, si, podía ser. Veo un poco más limpia la de Ricardo. 

Ricardo, funciona perfectamente.

Pero cuando dices:
> Aunque para ser sinceros, si el fichero de movimientos no es muy grande, 
> simplemente cargaría todas las líneas en memoria y me ahorraría tener que 
> leerlas cada vez desde disco.


1º: ¿como las cargo en memória? No encuentro documentación.

2º ahora es una mierdecilla de uno 120 registros. Pero con el paso del tiempo, 
cuando sea rico, a lo mejor son varios miles :-)) ojalá. ¿a partir de que punto 
crees que merece la pena el cambio entre memoria/disco? Supongo que dependerá 
del equipo donde corra la app.

Como se trata de aprender voy a ver si soy capaz de implementar las dos 
opciones y ver el tiempo que tarda en cada una.



Lo dicho, muchísimas gracias a los tres. Y feliz verano a todos.




Saludos,

--
Javier Pérez
http://es.linkedin.com/in/javierperez1
http://www.perasalvino.es/




> El 11 jul 2020, a las 23:44, Ricardo Cárdenes <ricardo.carde...@gmail.com> 
> escribió:
> 
> 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.
> 
> No, los objetos _csv.reader son iteradores puros y duros.
> 
> Pero iteran sobre un objeto de tipo fichero, así que hay un truco...
> 
> with open('movimientos.csv') as mov_file:
>     fondos_csv = csv.reader(open('fondos.csv'), delimiter=';’)
> 
>     print("Leyendo fondo: ")
>     for fondo in fondos_csv:
>         # Volvemos al inicio
>         mov_file.seek(0)
>         for movimiento in csv.reader(mov_file, delimiter=';'):
>             print("dentro de movimiento")
> 
>         print("For exterior")
> 
> En realidad no hay necesidad de recrear el "reader" para los movimientos cada 
> vez. Un simple "seek(0)" del fichero basta y funciona bien. Pero queda más 
> limpio.
> 
> Aunque para ser sinceros, si el fichero de movimientos no es muy grande, 
> simplemente cargaría todas las líneas en memoria y me ahorraría tener que 
> leerlas cada vez desde disco.
> 
> Saludos,
> Ricardo
> 
> On Sat, Jul 11, 2020 at 2:13 AM Alexis Roda <alexis.roda.villalo...@gmail.com 
> <mailto:alexis.roda.villalo...@gmail.com>> wrote:
> 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 <javierpe...@perasalvino.es 
> <mailto:javierpe...@perasalvino.es>> 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://es.linkedin.com/in/javierperez1>
> http://www.perasalvino.es/ <http://www.perasalvino.es/>
> 
> 
> 
> 
> _______________________________________________
> Python-es mailing list
> Python-es@python.org <mailto:Python-es@python.org>
> https://mail.python.org/mailman/listinfo/python-es 
> <https://mail.python.org/mailman/listinfo/python-es>
> _______________________________________________
> Python-es mailing list
> Python-es@python.org <mailto:Python-es@python.org>
> https://mail.python.org/mailman/listinfo/python-es 
> <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

Responder a