[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