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