2013-06-21 17 views
5

Ahoy ile eşleşiyorsa, bazı büyük CSV dosyalarını filtrelemek için bir Python komut dosyası yazıyorum.Bir CSV'den satır döndürme, satır içinde belirtilen değer

Sadece kriterlerimi karşılayan satırları tutmak istiyorum.

My giriş

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

Ben Total_Depth 0.

Ben veri okumak için this answer takip ediyorum olduğu satırları dönmek istiyorum aşağıdaki biçimde bir CSV dosyası . Ama satırları ayrıştırmaya ve durumumu karşılayan çizgileri çıkarmaya çalışırken sıkışıp kaldım.

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 

benim veri bir sözlük biçiminde şimdi anlıyorum, ben de "Total_Depth" anahtarına dayalı filtrelemek istiyorum, ama emin değilim: Burada

var bugüne kadar kodudur bu nasıl yapılır. İlgili satırları seçmek için bir 'if' ifadesini kullanmayı düşünüyorum, ancak bunu sözlük yapısıyla nasıl yapacağınızdan emin değilim.

Her türlü öneri çok takdir edilecektir. Eğer zip tam sonucunu saklıyorsanız SB :)

cevap

8

kullanın liste anlama.

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

Teşekkürler @falsetru, bu bir tedavi oldu. –

2

, sen atamadan önce ilgili başlığı kontrol edebilirsiniz:

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

Teşekkürler @blazetopher :) –

+0

no problem, DictReader'ın farkında değildim! – blazetopher

+1

@s_boardman Sorununuza uyup uymadığından emin değilim, ancak [numpy.genfromtxt] 'a bakabilirsiniz (http://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html). Potansiyel fayda, fonksiyonun gelişmiş dilimlemeye izin veren bir numpy.ndarray (yapılandırılmış) ile sonuçlanması olacaktır. Ayrıca, veri türleriniz üzerinde hassas kontrol sahibi olursunuz (eğer önemliyse). – blazetopher

1

Eğer C paralel listeleri ile uğraşmak zorunda çünkü oldukça zor markaları satır işlemlerini kullanan listelerin sözlük. namedtuples, tablo verileri toplamak ve işlemek için çok daha uygun bir yoldur.

Diğer yanıtlar, yaşadığınız tam sorunu karşılar. Daha samimi bir veri yapısı kullanmak, yarın sahip olduğunuz sorunlara yardımcı olacaktır.

+0

Teşekkürler @msw, namedtuples'a girmeyi deneyeceğim ve bununla birlikte betiğin daha iyi bir sürümünü oluşturabilir miyim diye bakacağım. :) –