2010-05-19 42 views
19

Tôi đang cố gắng kiểm tra giá trị của dữ liệu được trích xuất dựa vào csv mà tôi đã có. Nó sẽ chỉ lặp qua các hàng của CSV một lần, tôi chỉ có thể kiểm tra một giá trị của feed.items(). Có giá trị nào tôi cần phải đặt lại ở đâu đó không? Có cách nào tốt hơn/hiệu quả hơn để làm điều này? Cảm ơn.Đọc từ CSV trong Python liên tục?

orig = csv.reader(open("googlel.csv", "rb"), delimiter = ';') 
goodrows = [] 
for feed in gotfeeds:  
    for link,comments in feed.items(): 
     for row in orig: 
      print link 
      if link in row[1]: 
       row.append(comments) 
       goodrows.append(row) 

Trả lời

27

Bạn có thể "thiết lập lại" các iterator CSV bằng cách đặt lại vị trí đọc của đối tượng tập tin.

data = open("googlel.csv", "rb") 
orig = csv.reader(data, delimiter = ';') 
goodrows = [] 
for feed in gotfeeds:  
    for link,comments in feed.items(): 
     data.seek(0) 
     for row in orig: 
      print link 
      if link in row[1]: 
       row.append(comments) 
       goodrows.append(row) 
+0

Hoạt động tuyệt vời, cảm ơn. Tệp của tôi nhỏ trong tương lai gần, nhưng tôi ghét phải theo dõi lý do tại sao nó chậm trong một vài tháng. – matt

7

Làm orig một danh sách tránh sự cần thiết để thiết lập lại/reparse csv:

orig = list(csv.reader(open("googlel.csv", "rb"), delimiter = ';')) 
+4

Điều này về mặt kỹ thuật sẽ hoạt động nhưng sẽ khiến toàn bộ tệp CSV được tải vào bộ nhớ. Không phải là một vấn đề lớn nếu tập tin nhỏ, nhưng điều này sẽ không quy mô. – Cerin

+0

@Chris. Thật. Nếu các tập tin csv là rất lớn, tôi hy vọng anh ta đề cập đến rằng trong câu hỏi, nhưng chắc chắn có chỗ cho cả hai giải thích của chúng tôi. – unutbu

+0

Tôi đồng ý với Chris S. Chúng tôi phải đối mặt với cùng một vấn đề .. cuối cùng các tệp CSV của chúng tôi nhận được tối đa 5gb một phần. Không cần phải nói, đó là một cơn ác mộng – dassouki