2016-09-07 1 views
0

Ich möchte Ihnen ein Beispiel geben. Wenn ich versuche, Zeilen mit der Ganzzahl -9999 aus einer Datei zu drucken.Wie kann ich regulären Ausdruck beim Lesen einer Textdatei in Python verwenden?

19940325  78  -28 -9999 
19940326  50  17  102 
19940327  100  -11 -9999 
19940328  56  -33  0 
19940329  61  -39 -9999 
19940330  61  -56  0 
19940331  139  -61 -9999 
19940401  211  6  0 

hier ist mein Code, regex verwendet die Textdatei und Scans lesen nur die Zeile/Zeilen die ganze Zahl -9999 und Druck zu finden, der diese ganze Zahl enthält.

Mein Code läuft mit Fehler, zeigt aber nichts in der Ausgabe. Bitte lassen Sie mich wissen, welchen Fehler ich gemacht habe.

+1

Sie nur direkt laufen kann über Ihre Datei (zB 'für Zeile in Datei') -' readlines' liest die gesamte Datei * zuerst * in den Speicher. Das ist schlecht, wenn Ihre Datei 50 GB groß ist. –

Antwort

3

Regex wahrscheinlich Overkill hierfür ist eine einfache Teilzeichenprüfung der in Operator scheint ausreichend

with open("USC00110072.txt") as f: 
    for line in f: 
     if '-9999' in line: 
      print(line) 

Oder wenn Sie über diese Anpassungs befürchten, dass als „Ganzes Wort“ Sie ein wenig tun kann mehr aufzuteilen können die Werte

with open("USC00110072.txt") as f: 
    for line in f: 
     if '-9999' in line.strip().split('\t'): 
      print(line) 
+0

Was ist, wenn nur die Zeilen mit dem Wert -9999 in der dritten Spalte gedruckt werden sollen? –

1

Sie verwenden filter:

with open(fn) as f: 
    print filter(lambda line: '-9999' in line.split()[-1], f) 

Dies wird prüfen, ob '-9999' in der letzten Spalte der Zeile steht.

Wenn Sie einen regulären Ausdruck verwenden möchten:

with open(fn) as f: 
    for line in f: 
     if re.search(r'-9999$', line): # remove $ if the -9999 can be anywhere in the line 
      print line.strip() 

Die ^ Sie haben nie mit Ausnahme einer Linie entsprechen, die nur enthält -9999 und nichts anderes. Die ^ zeigt den Anfang der Zeile an.

Oder nur in verwenden, um die Anwesenheit des Strings testen:

with open(fn) as f: 
    for line in f: 
     if '-9999' in line: 
      print line.strip() 
+0

danke Dawg. wirklich zu schätzen –

1

Alternativ kann, da Sie eine csv-Datei können Sie den csv Modul verwenden:

import csv 
import io 

file = io.StringIO(u''' 
19940325\t78\t-28\t-9999 
19940326\t50\t17\t102 
19940327\t100\t-11\t-9999 
19940328\t56\t-33\t0 
19940329\t61\t-39\t-9999 
19940330\t61\t-56\t0 
19940331\t139\t-61\t-9999 
19940401\t211\t6\t0 
'''.strip()) 

reader = csv.reader(file, delimiter='\t') 
for row in reader: 
    if row[-1] == '-9999': # or, for regex, `re.match(r'^-9999$', row[-1])` 
     print('\t'.join(row)) 
+1

Verwenden von 'CSV' für Tab getrennt Daten ist eine gute Idee, unter der Annahme, dass die einzelnen Felder überhaupt eine Rolle spielen. Ich würde es auch für die Ausgabe verwenden, nur für den Fall; Sie können einfach 'sys.stdout' in eine' csv.writer' einbinden, um zu passen. – ShadowRanger

Verwandte Themen