2013-06-21 24 views
5

Ahoy, tôi đang viết một tập lệnh Python để lọc một số tệp CSV lớn.Trả lại hàng từ một CSV, nếu giá trị được chỉ định trong hàng khớp với điều kiện

Tôi chỉ muốn giữ các hàng đáp ứng tiêu chí của mình.

đầu vào của tôi là một tập tin CSV theo định dạng sau

Locus   Total_Depth Average_Depth_sample Depth_for_17 
chr1:6484996 1030   1030     1030 
chr1:6484997 14   14      14 
chr1:6484998 0   0      0 

Tôi muốn quay trở lại dòng nơi Total_Depth là 0.

Tôi đã làm theo this answer để đọc dữ liệu . Nhưng tôi đang cố gắng phân tích các hàng và rút ra những dòng đáp ứng được điều kiện của tôi.

Dưới đây là đoạn code tôi có cho đến nay:

import csv 

f = open("file path", 'rb') 
reader = csv.reader(f) #reader object which iterates over a csv file(f) 
headers = reader.next() #assign the first row to the headers variable 
column = {} #list of columns 
for h in headers: #for each header 
    column[h] = [] 
for row in reader: #for each row in the reader object 
    for h, v in zip(headers, row): #combine header names with row values (v) in a series of tuples 
     column[h].append(v) #append each value to the relevant column 

Tôi hiểu rằng dữ liệu của tôi bây giờ là trong một định dạng từ điển, và tôi muốn lọc nó dựa trên "Total_Depth" chìa khóa, nhưng tôi không chắc chắn làm như thế nào. Tôi đang định sử dụng câu lệnh 'if' để chọn các hàng có liên quan, nhưng không chắc chắn cách thực hiện điều này với cấu trúc từ điển.

Mọi lời khuyên sẽ được đánh giá cao. SB :)

Trả lời

8

Sử dụng danh sách hiểu.

import csv 

with open("filepath", 'rb') as f: 
    reader = csv.DictReader(f) 
    rows = [row for row in reader if row['Total_Depth'] != '0'] 

for row in rows: 
    print row 

DictReader

+0

Cảm ơn @falsetru, đó là một điều trị. –

2

Nếu bạn lưu trữ toàn bộ kết quả của sự zip, bạn có thể kiểm tra các tiêu đề thích hợp trước khi gán:

... 
for row in reader: #for each row in the reader object 
    r = zip(headers, row): 
    if r['Total_Depth'] == 0: 
     for h, v in r: 
      column[h].append(v) 
+0

Cảm ơn @blazetopher :) –

+0

không sao, tôi không biết về DictReader! – blazetopher

+1

@s_boardman Tôi không chắc liệu nó có phù hợp với vấn đề của bạn hay không, nhưng bạn có thể xem [numpy.genfromtxt] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html). Lợi ích tiềm năng sẽ là hàm kết quả trong một numpy.ndarray (có cấu trúc), cho phép cắt nâng cao. Bạn cũng có thể kiểm soát chi tiết các loại dữ liệu của mình (nếu điều đó quan trọng). – blazetopher

1

Từ điển danh sách mà bạn đang sử dụng làm cho các hoạt động hàng khá khó khăn bởi vì bạn phải gây rối với C danh sách song song. namedtuples là một cách thuận tiện hơn nhiều để thu thập và hoạt động trên dữ liệu dạng bảng.

Các câu trả lời khác đáp ứng được vấn đề chính xác mà bạn có. Sử dụng cấu trúc dữ liệu thân thiện hơn sẽ giúp bạn giải quyết vấn đề ngày mai.

+0

Cảm ơn @msw, tôi sẽ cố gắng đào sâu vào tên gọi và xem liệu tôi có thể xây dựng một phiên bản kịch bản tốt hơn với điều đó không. :) –

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