2012-06-22 42 views
11

Tôi là người mới bắt đầu của Python. Tôi đang cố gắng tìm ra lý do tại sao vòng lặp 'for' thứ hai không hoạt động trong tập lệnh sau. Tôi có nghĩa là tôi chỉ có thể nhận được kết quả của vòng lặp 'for' đầu tiên, nhưng không có gì từ kết quả thứ hai. Tôi đã sao chép và dán tập lệnh của tôi và dữ liệu csv ở bên dưới.Tại sao tôi không thể lặp lại vòng lặp 'for' cho csv.Reader? (Python)

Sẽ rất hữu ích nếu bạn cho tôi biết tại sao nó lại theo cách này và cách làm cho vòng lặp 'for' thứ hai hoạt động tốt.

SCRIPT của tôi:

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 

Trả lời

26

Người đọc csv là một iterator trong tập tin. Một khi bạn đi qua nó một lần, bạn đọc đến cuối của tập tin, vì vậy không có nhiều hơn để đọc. Nếu bạn cần phải đi qua nó một lần nữa, bạn có thể tìm đến đầu của tập tin:

fh.seek(0) 

này sẽ đặt lại các tập tin để bắt đầu, do đó bạn có thể đọc nó một lần nữa.

Nếu tập tin không phải là quá lớn và bạn cần phải làm một vài điều với các dữ liệu, bạn có thể cũng chỉ cần đọc toàn bộ điều vào một danh sách:

data = list(read) 

Sau đó, bạn có thể làm những gì bạn muốn với data.

+0

là fileobject (không csv) đọc theo cùng một cách? – SIslam

+0

@SIslam: Vâng, nếu tôi hiểu bạn đúng. Nếu bạn lặp qua một tập tin, sau đó khi bạn nhận được đến cùng bạn đã cạn kiệt các iterator và không thể đọc nữa, trừ khi bạn tìm kiếm trở lại đầu. – BrenBarn

2

Tôi đã tạo ra mảnh nhỏ của chức năng mà nai lấy đường dẫn của file csv đọc và danh sách các dict trở lại ngay lập tức sau đó bạn lặp qua danh sách rất dễ dàng,

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 

Trân

Các vấn đề liên quan