2013-06-21 8 views
5

Ahoj, piszę skrypt w języku Python, aby odfiltrować duże pliki CSV.Zwracanie wiersza z pliku CSV, jeśli określona wartość w wierszu pasuje do warunku

Chcę tylko zachować wiersze, które spełniają moje kryteria.

Mój wkład jest plik CSV w następującym formacie

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

chcę wrócić linie gdzie Total_Depth 0.

Śledzę this answer aby odczytać dane . Ale utknąłem próbując parsować rzędy i wyciągnąć linie, które spełniają mój stan.

Oto kod mam tak daleko:

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 

Rozumiem, że moje dane są teraz w formie słownika, i chcę, aby filtrować je na podstawie klucza „Total_Depth”, ale jestem pewien, jak to zrobić. Zamierzam użyć instrukcji "if", aby wybrać odpowiednie wiersze, ale nie jestem pewien, jak to zrobić ze strukturą słownika.

Każda rada byłaby mile widziana. SB :)

Odpowiedz

8

Używaj listowych.

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

Dzięki @falsetru, to działało. –

2

Jeśli przechowywać pełny wynik na zamek błyskawiczny, można sprawdzić odpowiedni nagłówek przed przypisaniem:

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

Dzięki @blazetopher :) –

+0

nie ma problemu, nie byłem świadomy DictReader! – blazetopher

+1

@s_boardman Nie jestem pewien, czy to pasuje do twojego problemu, ale możesz rzucić okiem na [numpy.genfromtxt] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html). Potencjalną korzyścią byłoby to, że funkcja daje numpy.ndarray (structured), która pozwala na zaawansowane cięcie. Można również uzyskać szczegółową kontrolę nad typami danych (jeśli jest to ważne). – blazetopher

1

Słownik list, że używasz operacji sprawia, że ​​wiersz dość trudne, bo trzeba zadzierać z C równoległych list. namedtuples to znacznie wygodniejszy sposób gromadzenia i operowania na danych tabelarycznych.

Inne odpowiedzi odpowiadają dokładnie temu problemowi. Korzystanie z bardziej przyjaznej struktury danych pomoże rozwiązać problemy, które pojawią się jutro.

+0

Dzięki @msw, spróbuję zagłębić się w kciuki i zobaczę, czy uda mi się zbudować lepszą wersję tego skryptu. :) –

Powiązane problemy