2013-06-21 6 views
5

अहोई के भीतर निर्दिष्ट मान, मैं कुछ बड़ी सीएसवी फाइलों को फ़िल्टर करने के लिए एक पायथन स्क्रिप्ट लिख रहा हूं।सीएसवी से एक पंक्ति लौटाना, यदि पंक्ति मिलान स्थिति

मैं केवल उन पंक्तियों को रखना चाहता हूं जो मेरे मानदंडों को पूरा करते हैं।

मेरे इनपुट निम्न स्वरूप

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

मैं लाइनों वापस जाने के लिए जहां Total_Depth 0.

मैं डेटा को पढ़ने में this answer निम्नलिखित किया गया है है चाहता हूँ में CSV फ़ाइल है । लेकिन पंक्तियों पर पार्स करने की कोशिश कर रहा हूं और मेरी हालत को पूरा करने वाली लाइनों को खींच रहा हूं।

यहाँ कोड है मैं अब तक है:

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 

मैं समझता हूँ कि मेरे डेटा एक शब्दकोश स्वरूप में है, और मैं "Total_Depth" कुंजी के आधार पर यह फ़िल्टर करना चाहते हैं, लेकिन मैं अनिश्चित हूं यह कैसे करना है। मैं प्रासंगिक पंक्तियों का चयन करने के लिए 'if' कथन का उपयोग करना चाहता हूं, लेकिन यह सुनिश्चित नहीं करता कि शब्दकोश संरचना के साथ इसे कैसे किया जाए।

किसी भी सलाह की सराहना की जाएगी। एस.बी. :)

उत्तर

8

का प्रयोग करें।

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

धन्यवाद @falsetru, यह एक इलाज किया है। –

2

आप ज़िप से भरा परिणाम की दुकान हैं, तो आप उचित हेडर असाइन करने से पहले जांच कर सकते हैं: सूची समझ

... 
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

धन्यवाद @blazetopher :) –

+0

कोई समस्या नहीं, मुझे डिक्ट्रेडर से अवगत नहीं था! – blazetopher

+1

@s_boardman मुझे यकीन नहीं है कि यह आपकी समस्या के अनुरूप है, लेकिन हो सकता है कि आप [numpy.genfromtxt] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html पर एक नज़र डालें)। संभावित लाभ यह होगा कि फ़ंक्शन के परिणामस्वरूप numpy.ndarray (संरचित) होता है, जो उन्नत स्लाइसिंग की अनुमति देता है। आप अपने डेटा प्रकारों पर बढ़िया नियंत्रण भी प्राप्त कर पाएंगे (यदि यह महत्वपूर्ण है)। – blazetopher

1

सूचियों कि आप बनाता पंक्ति आपरेशन काफी मुश्किल है क्योंकि आप सी समानांतर सूची के साथ गड़बड़ करने के लिए है का उपयोग कर रहे शब्दकोश। namedtuples टैब्यूलर डेटा एकत्र करने और संचालित करने का एक और अधिक सुविधाजनक तरीका है।

अन्य उत्तरों आपके पास सही समस्या को पूरा करते हैं। अधिक अनुकूल डेटा संरचना का उपयोग करने से आपकी कल की समस्याओं में मदद मिलेगी।

+0

धन्यवाद @msw, मैं नामांकित करने के लिए खोदने की कोशिश करूंगा और देख सकता हूं कि मैं इसके साथ स्क्रिप्ट का बेहतर संस्करण बना सकता हूं या नहीं। :) –

संबंधित मुद्दे