2011-11-04 26 views
9

Tengo una gran cantidad de archivos .csv en un directorio y me gustaría abrir cada uno de ellos en un bucle dentro de Python para que el primer .csv se lea en la lista [0] y el segundo .csv se lee en la lista [1] y así sucesivamente.Lectura de archivos .csv en listas de Python

Desafortunadamente, mientras mi código recorre todos los archivos .csv, coloca todos los archivos .csv en la lista [0]. ¿Cómo puedo modificar mi código para poder alcanzar mi objetivo anterior? Muchas gracias.

John

Aquí está el código:

def create_data_lists(): 
i=0 
for symbol in symbols: 
    with open(symbols[i]+'.csv', 'r') as f: 
     print i 
     reader = csv.reader(f) 
     reader.next() 
     for row in reader: 
      rowdata.append(row) 
    data_by_symbol.append(rowdata) 
    i=i+1 
+0

No necesita usar indexación cuando está usando 'for ... in', por lo que puede reemplazar' open (symbols [i] ...) 'con' open (symbol ...) ', y get deshacerse de todos los 'i''s. – tjm

Respuesta

11

dentro del bucle, en la parte superior, hay que actualizar la lista rowdata. de lo contrario, lo estás agregando para siempre. tener algo como rowdata = [] justo después print i

def create_data_lists(): 

    for symbol in symbols: 
     with open(symbol+'.csv', 'r') as f: 
     print symbol 
     rowdata = [] 
     reader = csv.reader(f) 
     reader.next() 
     for row in reader: 
      rowdata.append(row) 
    data_by_symbol.append(rowdata) 

EDITAR se deshizo de i, ya que estoy realmente no usarlo

+0

Añadiendo rowdata = [] hizo el truco. ¡Gracias! Sin embargo, cuando eliminé la indexación, recibí el siguiente error: "línea 35, en create_data_lists con open (symbols + '. Csv', 'rb') como f: TypeError: solo puede concatenar lista (no" str ") para enumerar " – johnjdc

+0

@johnjdc: tenga en cuenta la diferencia entre' símbolo' y 'símbolos'. con el símbolo 'for symbol in symbols:', obtendrá cada elemento de la lista símbolos uno por uno, eliminando la necesidad de tener 'i' de su programa. simplemente limpia el código una vez que está familiarizado con la expresión. tu código parecía redundante para mí y para otros, como tjm señaló. – yosukesabai

+0

también, puede tener sentido hacer que 'data_by_symbol' sea un dict (' date_by_symbol = {} 'en algún lugar de su código), en lugar de list. de esa manera dices 'data_by_symbol [symbol] = rowdate' en la última línea del código anterior. cuando lo usas, puedes data_by_symbol [mysymbol] para obtener datos para mysymbol, o 'para sym, dat para data_by_symbol.items()' para iterar sobre todos los símbolos. Otra característica pequeña, como no perder de vista el significado de i = 0, i = 1, etc. no es divertido. – yosukesabai

6

por qué no almacenar los propios lectores en una lista?

list_of_csv_files = [] 

for f in filenames: 
    list_of_csv_files.append(csv.DictReader(open(f))) 

Esto almacenará el propio lector en una lista, que le permite hacer más adelante algo como:

for row in list_of_csv_files[0]: 
    # do some processing on the row 

La mayor ventaja de este método es taht a continuación, puede hacer cosas como columnas de filtro con facilidad, utilizando métodos tales como:

one_row = [row["name of column heading"] for row in list_of_csv_files[0]] 
two_rows = [[row["name col 2"], row["name col 2"]] for row in list_of_csv_files[0]] 

que sospecho que sería más útil para su programa de almacenamiento de prelectura (y por tanto de-estructurada) csv.

pero si realmente quiere tener todos los archivos CSV leído y almacenados en una lista, tendrá una lista de listas, no recomiendo esto, va a ser muy intensivo de la memoria:

list_of_csv_files = [[]] 

for f in filenames: 
    list_of_csv_files.append([row.values() for row in csv.DictReader(open(f))]) 
+0

Estoy ansioso por aprender mejores métodos: soy autodidacta y definitivamente un principiante. Mi intención es realizar operaciones matemáticas en todos los datos .csv que leo en las listas de Python.Desde su publicación, ¿entiendo que mi código será lento usando listas de listas? Elegí este método simplemente porque es el único que conozco que me permite distinguir fácilmente qué datos .csv estoy analizando. Si tienes mejores sugerencias dadas mis metas, soy todo oídos. Gracias. – johnjdc

+0

Claro, ampliaré mi respuesta para enseñarte algunas técnicas diferentes. – Serdalis

Cuestiones relacionadas