2012-06-22 12 views
11

Soy un principiante de Python. Estoy tratando de averiguar por qué el segundo bucle 'para' no funciona en el siguiente script. Quiero decir que solo pude obtener el resultado del primer ciclo 'for', pero nada del segundo. Copié y pegué mi script y el csv de datos en el siguiente.¿Por qué no puedo repetir el ciclo 'for' para csv.Reader? (Python)

Será útil si me dices por qué va de esta manera y cómo hacer que el segundo bucle 'para' funcione también.

mi guión:

import csv 

file = "data.csv" 

fh = open(file, 'rb') 
read = csv.DictReader(fh) 

for e in read: 
    print(e['a']) 

for e in read: 
    print(e['b']) 

"data.csv":

a,b,c 
tree,bough,trunk 
animal,leg,trunk 
fish,fin,body 

Respuesta

26

El lector CSV es un iterador sobre el archivo. Una vez que lo revisa una vez, lee hasta el final del archivo, por lo que ya no hay más que leer. Si tiene que ir a través de él de nuevo, se puede buscar al principio del archivo:

fh.seek(0) 

Esto reiniciará el archivo al principio para que pueda leer de nuevo.

Si el archivo no es demasiado grande y hay que hacer varias cosas con los datos, se podría también acaba de leer todo el asunto en una lista:

data = list(read) 

entonces usted puede hacer lo que quiera con data.

+0

¿Es FileObject (no csv) leer de la misma manera? – SIslam

+0

@SIslam: Sí, si entiendo bien. Si itera sobre un archivo, cuando llega al final agota el iterador y no puede leer más a menos que vuelva al principio. – BrenBarn

2

He creado pequeño trozo de función que doe tomar la ruta del archivo csv leer y lista de dict regresar a la vez y luego se recorre la lista muy fácilmente,

def read_csv_data(path): 
    """ 
     Reads CSV from given path and Return list of dict with Mapping 
    """ 
    data = csv.reader(open(path)) 
    # Read the column names from the first line of the file 
    fields = data.next() 
    data_lines = [] 
    for row in data: 
     items = dict(zip(fields, row)) 
     data_lines.append(items) 
    return data_lines 

Saludos

Cuestiones relacionadas