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

254 views
Skip to first unread message

Rolando Paz

unread,
Jan 3, 2016, 7:17:10 PM1/3/16
to La lista de python en castellano
Hola a todos de nuevo...

Una carpeta contiene estos 10 archivos:

bram_aa0
bram_aa1
bram_aa2
bram_aa3
bram_aa4

bram_cc0
bram_cc1
bram_cc2
bram_cc3
bram_cc4

Lo que quiero lograr hacer es algo parecido a esto:

for i in range(0,5):
    bram_aa = [open("bram_aa%s"%i,"r")]
    bram_cc = [open("bram_cc%s"%i,"r")]
    
Sin embargo, con este for lo que logro es que la variable bram_aa tome el ultimo valor iterado, es decir que bram_aa = bram_aa4 y bram_cc = bram_cc4, y lo que me gustaría es que se crearan todas las variables. 

En esencia lo que quiero es abrir cada uno de los diez archivos, sin embargo no quiero colocar paralelo las 10 ordenes "open" por separado.

bram_aa0=open("bram_aa0","r")
bram_aa1=open("bram_aa1","r")
bram_aa2=open("bram_aa2","r")
....etc

Cualquier ayuda se los agradeceré....

Feliz Año 2016!

Saludos

Ignacio Rodríguez

unread,
Jan 3, 2016, 7:26:24 PM1/3/16
to La lista de python en castellano
Hola, yo usaría algo así

bram_aa = []
bram_bb = []
bram_cc = []
for i in range(0,5):
    bram_aa[i] = open("bram_aa%s"%i,"r")
    bram_bb[i] = open("bram_bb%s"%i,"r")
    bram_cc[i] = open("bram_cc%s"%i,"r")

Y luego simplemente los "llamas" bram_aa[0], bram_bb[0], bram_cc[0]
    


Ignacio Rodríguez

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


Rolando Paz

unread,
Jan 3, 2016, 7:42:25 PM1/3/16
to La lista de python en castellano
Hola Ignacio

Hice esto:

bram_aa = []
bram_cc = []

for i in range(0,5):
    bram_aa[i] = open("bram_aa%s"%i,"r")
    bram_cc[i] = open("bram_cc%s"%i,"r")
 
print 'este es el contenido de bram_cc2 =',bram_cc2

y el error que aparece es este:

Traceback (most recent call last):
  File "plot_artecorr_4bram_auto_promedio.py", line 39, in <module>
    bram_aa[i] = open("bram_aa%s"%i,"r")
IndexError: list assignment index out of range

que opinas?

Rolando Paz

unread,
Jan 3, 2016, 7:59:30 PM1/3/16
to La lista de python en castellano
Creo que encontré la solución con esto:

bram_aa = []
bram_cc = []

for i in range(0,5):
    bram_aa.append(open("bram_aa%s"%i,"r"))
    bram_cc.append(open("bram_cc%s"%i,"r"))
 
Gracias igualmente...

Saludos

Rolando Paz

Ignacio Rodríguez

unread,
Jan 3, 2016, 11:08:46 PM1/3/16
to La lista de python en castellano
Sip, mi error! Debí haberlo mandado con append, mil disculpas.

Saludos

Ignacio Rodríguez

Chema Cortes

unread,
Jan 3, 2016, 11:14:36 PM1/3/16
to La lista de python en castellano
names = [ "bram_{}{}".format(sufijo, i) for sufijo in ("aa","bb","cc") for i in range(0,5) ]
files = { fname:open(fname,"r") for fname in names }
--
Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales": http://ch3m4.org/blog

Edison Ibañez

unread,
Jan 4, 2016, 3:13:44 AM1/4/16
to La lista de python en castellano
si aun te sirve también lo puedes hacer de esta forma:

files = []
data_aa = {}
for i in range(0, 5):
    files.append('bram_aa{}'.format(i))

for i in files:
    data_aa[i] = open(i, 'r')

print(data_aa[files[0]])

El 03/01/16 a las 19:59, Rolando Paz escribió:

Rolando Paz

unread,
Jan 4, 2016, 12:31:11 PM1/4/16
to La lista de python en castellano
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?

Saludos

Rolando Paz





Carlos Zuniga

unread,
Jan 13, 2016, 10:16:34 AM1/13/16
to La lista de python en castellano
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.

Rolando Paz

unread,
Jan 24, 2016, 8:31:53 PM1/24/16
to La lista de python en castellano
Hola Carlos 

Perdona que hasta ahora contesté, pero te agradezco el correo. Me sirvió mucho para reducir las iteraciones del código y que fuera más resumido.

Muchas gracias de nuevo.

Reply all
Reply to author
Forward
0 new messages