2013-06-21 6 views
5

Ahoi, ich schreibe ein Python-Skript, um einige große CSV-Dateien zu filtern.Zurückgeben einer Zeile aus einer CSV-Datei, wenn der angegebene Wert in der Zeile der Bedingung entspricht

Ich möchte nur Zeilen, die meine Kriterien erfüllen.

Meine Eingabe ist eine CSV-Datei in folgendem Format

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

Ich möchte Linien zurückzukehren, wo die Total_Depth ist 0.

Ich habe this answer wurde im Anschluss an die Daten zu lesen, . Aber ich bleibe stecken, versuchen, über die Reihen zu analysieren und ziehe die Linien heraus, die meinen Zustand treffen. Hier

ist der Code Ich habe bisher:

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 

Ich verstehe, dass meine Daten nun in einem Wörterbuch-Format ist, und ich möchte es filtern, basierend auf der „Total_Depth“ -Taste, aber ich bin nicht sicher, Wie macht man das. Ich ziele darauf ab, eine 'if' Anweisung zu verwenden, um die relevanten Zeilen auszuwählen, aber nicht sicher, wie dies mit der Wörterbuchstruktur zu tun ist.

Jeder Rat würde sehr geschätzt werden. SB :)

Antwort

8

Verwenden Liste Verständnis.

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

Dank @falsetru, das hat ein Vergnügen gemacht. –

2

Wenn Sie das vollständige Ergebnis der zip speichern, können Sie die entsprechenden Header überprüfen, bevor die Zuordnung:

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

Danke @blazetopher :) –

+0

kein Problem, ich war mir DictReader nicht bewusst! – blazetopher

+1

@s_boardman Ich bin mir nicht sicher, ob es zu Ihrem Problem passt, aber Sie können sich [numpy.genfromtxt] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html) ansehen). Der potentielle Vorteil wäre, dass die Funktion zu einem numpy.darray (strukturiert) führt, das ein erweitertes Slicing ermöglicht. Sie könnten auch eine fein abgestimmte Kontrolle über Ihre Datentypen haben (wenn das wichtig ist). – blazetopher

1

Das Wörterbuch der Listen, die Sie macht Zeilenoperationen ziemlich schwierig, weil man mit C parallel Listen haben zu Chaos verwenden. namedtuples sind eine viel bequemere Möglichkeit zum Sammeln und Bearbeiten von Tabellendaten.

Die anderen Antworten erfüllen genau das Problem, das Sie haben. Eine freundlichere Datenstruktur hilft Ihnen bei den Problemen, die Sie morgen haben.

+0

Danke @msw, Ich werde versuchen, in namedtuples zu graben und sehen, ob ich damit eine bessere Version des Skripts erstellen kann. :) –

Verwandte Themen