2013-01-04 38 views
41

Xử lý tệp CSV với csv.DictReader thật tuyệt - nhưng tôi có tệp CSV có dòng chú thích trong (được chỉ ra bởi băm ở đầu dòng), ví dụ:Python: bỏ qua các dòng chú thích được đánh dấu bằng # trong csv.DictReader

 
# step size=1.61853 
val0,val1,val2,hybridisation,temp,smattr 
0.206895,0.797923,0.202077,0.631199,0.368801,0.311052,0.688948,0.597237,0.402763 
-169.32,1,1.61853,2.04069e-92,1,0.000906546,0.999093,0.241356,0.758644,0.202382 
# adaptation finished 

Mô-đun csv doesn't include any way to skip such lines.

Tôi có thể dễ dàng làm điều gì đó hacky, nhưng tôi tưởng tượng có một cách tốt đẹp để bọc một csv.DicReader xung quanh một số đối tượng iterator khác, mà tiền xử lý để loại bỏ các dòng.

Trả lời

59

Trên thực tế việc này độc đáo với filter:

import csv 
fp = open('samples.csv') 
rdr = csv.DictReader(filter(lambda row: row[0]!='#', fp)) 
for row in rdr: 
    print(row) 
fp.close() 
+15

Điều đó sẽ đọc toàn bộ tập tin vào bộ nhớ. Nếu nó không phải là quá lớn thì không có vấn đề, nếu không bạn có thể muốn sử dụng một biểu thức máy phát điện hoặc 'itertools.ifilter()'. – Duncan

+29

... hoặc biểu thức trình tạo: 'csv.DictReader (hàng cho hàng trong fp nếu không row.startswith ('#'))' –

+0

@Duncan không cần itertools trong Python3.6, dưới dạng 'bộ lọc() 'sẽ trả về một trình lặp theo mặc định, do đó tệp sẽ không được nạp vào bộ nhớ. –

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