2012-06-22 14 views
11

Jestem początkujący w Pythonie. Próbuję teraz dowiedzieć się, dlaczego druga pętla "for" nie działa w następującym skrypcie. Chodzi o to, że mogłem uzyskać wynik pierwszej pętli "za", ale nic z drugiej. Skopiowałem i wkleiłem mój skrypt i plik danych CSV poniżej.Dlaczego nie mogę powtórzyć pętli for dla csv.Reader? (Python)

Pomocne będzie, jeśli powiesz mi, dlaczego tak działa i jak zrobić drugą pętlę "za".

mój skrypt:

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 

Odpowiedz

26

Czytelnik CSV jest iterator na pliku. Kiedy raz to zrobisz, przeczytasz do końca pliku, więc nie ma już nic do czytania. Jeśli trzeba przejść przez to jeszcze raz, można szukać na początku pliku:

fh.seek(0) 

To będzie zresetować plik na początku, dzięki czemu można ją ponownie przeczytać.

Jeśli plik nie jest zbyt duży i trzeba zrobić kilka rzeczy z danymi, można też po prostu przeczytać całość na listę:

data = list(read) 

Potem możesz robić co chcesz z data.

+0

Czy fileobject (nie CSV) czyta się w ten sam sposób? – SIslam

+0

@SIslam: Tak, jeśli dobrze cię rozumiem. Jeśli wykonujesz iterację po pliku, to gdy dojdziesz do końca, wyczerpiesz iterator i nie będziesz mógł czytać więcej, dopóki nie zaczniesz od początku. – BrenBarn

2

Stworzyłem kawałek funkcji, które DOE wziąć ścieżkę pliku csv czytać i bardzo łatwo listę dict wrócić od razu wtedy pętlę poprzez listy,

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 

Pozdrowienia

Powiązane problemy