[Python-es] Abrir varios archivos con "open"

Carlos Zuniga carlos.zun en gmail.com
Mie Ene 13 10:16:04 EST 2016


2016-01-04 12:31 GMT-05:00 Rolando Paz <flxpaz en gmail.com>:
> Muchas gracias a todos. Explicare de forma general lo que quiero lograr:
>
> Logre graficar los archivos "bram_aa", "bram_cc", "bram_ac_real" y
> "bram_ac_imag" de la siguiente forma:
>
>
> #ABRO LOS ARCHIVOS
> bram_aa=open("bram_aa","r")
> bram_cc=open("bram_cc","r")
> bram_ac_real=open("bram_ac_real","r")
> bram_ac_imag=open("bram_ac_imag","r")
>
> #USO SOLO LAS COLUMNAS 2 Y 8 DEL ARCHIVO BRAM
> cols_aa = np.loadtxt(bram_aa, dtype=str, usecols=[2,8])
> cols_cc = np.loadtxt(bram_cc, dtype=str, usecols=[2,8])
> cols_ac_real = np.loadtxt(bram_ac_real, dtype=str, usecols=[2,8])
> cols_ac_imag = np.loadtxt(bram_ac_imag, dtype=str, usecols=[2,8])
>
> #DEFINO EN UN PLANO XY, QUIEN ES "X" Y QUIEN ES "Y"
> x1 = cols_aa[:,0].astype(int)
> y1 = cols_aa[:,1]
>
> x2 = cols_cc[:,0].astype(int)
> y2 = cols_cc[:,1]
>
> x3 = cols_ac_real[:,0].astype(int)
> y3 = cols_ac_real[:,1]
>
> x4 = cols_ac_imag[:,0].astype(int)
> y4 = cols_ac_imag[:,1]
>
> Luego uso plot(x,y) entre otros comandos, para obtener las gráficas.
>
> Ahora de acuerdo a las características de mi aplicación, necesito obtener
> varias veces cada uno de los archivos bram, luego hacer un promedio de los
> datos de los archivos y luego graficar el promedio, es decir que ahora tengo
> los archivos:
>
> bram_aa0
> bram_aa1
> bram_aa2graficasgraficasgraficas
> ....etc
>
> bram_cc0
> bram_cc1
> bram_cc2
> ....etc
>
> bram_ac_real0
> bram_ac_real1
> bram_ac_real2
> ....etc
>
> bram_ac_imag0
> bram_ac_imag1
> bram_ac_imag2
> ....etc
>
> Para la parte de abrir los archivos, hago esto:
>
> bram_aa = []
> bram_cc = []
> bram_ac_real = []
> bram_ac_imag = []
>
> #CREANDO UN BUCLE PARA N ARCHIVOS, COMO EJEMPLO SE USO 3 ITERACIONES
> for i in range(0,3):
>     bram_aa.append(open("bram_aa%s"%i,"r"))
>     bram_cc.append(open("bram_cc%s"%i,"r"))
>     bram_ac_real.append(open("bram_ac_real%s"%i,"r"))
>     bram_ac_imag.append(open("bram_ac_imag%s"%i,"r"))
>
> Ahora entiendo que debo usar otro bucle para que lea las columnas 2 y 8 de
> cada bram y luego definir quien es la X y quien es Y, y luego hacer el
> promedio de todas la columnas para luego graficarlas.
>
> Que opinan?
>

Que en realidad lo que quieres guardar en las listas no son los
archivos sino las x & y, así que después de abrirlos y sacar los datos
que necesitas puedes descartarlos. Además el código es más fácil de
entender si agrupas todos los pasos para cada archivo:

    xy_aa = []
    xy_cc = []

    for i in range(0, 3):
        bram_aa = open("bram_aa%s" % i, "r")
        cols_aa = np.loadtxt(bram_aa, dtype=str, usecols=[2,8])
        x1 = cols_aa[:,0].astype(int)
        y1 = cols_aa[:,1]
        xy_aa.append((x1, y1))

       bram_cc = open("bram_cc%s"%i, "r")
       cols_cc = np.loadtxt(bram_cc, dtype=str, usecols=[2,8])
       x2 = cols_cc[:,0].astype(int)
       y2 = cols_cc[:,1]
       xy_cc.append((x2, y2))

       bram_ac_real...

    # luego en otro lado
    for x, y in xy_aa:
        plot(x, y)
    for x, y in xy_cc:
        plot(x, y)


Luego podrías darte cuenta que estas repitiendo el mismo código para
cada archivo que abres, entonces lo separas a una función y la llamas
en tu bucle para simplificar aun más el código:


    def get_xy(filename):
        bram = open(filename)
        cols = np.loadtxt(bram, dtype=str, usecols=[2,8])
        x = cols[:,0].astype(int)
        y = cols[:,1]
        return x, y

    xy_aa = []
    xy_cc = []

    for i in range(0, 3):
       x1, y1 = get_xy("bram_aa%s" % i, "r")
       xy_aa.append((x1, y1))

       x2, y2 = get_xy("bram_cc%s" % i, "r")
       xy_cc.append((x2, y2))

    # luego en otro lado
    for x, y in xy_aa:
        plot(x, y)
    for x, y in xy_cc:
        plot(x, y)


Luego podrías guardar todo en un diccionario en lugar de variables
individuales (algo como `{"aa": [(x1, y1), (x2, y2)], "bb": [(x2, y2),
(x3, y3)], etc}`) para hacer un bucle en lugar de escribir cada for
por separado:


    for name, points in mi_dict.items():
        print "plotting %s" % name
        for x, y in points:
            plot(x, y)



Saludos

-- 
A menudo unas pocas horas de "Prueba y error" podrán ahorrarte minutos
de leer manuales.


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