Ich muss aus jeder zweiten Zeile in meiner ASCII-Datei ein Array erstellen. Was ist der kürzeste Weg, um jede zweite nicht leere Zeile aus der Datei in Python zu lesen? Vielleicht über numpy genfromtxt?

Dateibeispiel:

hd105373_550  Alpha=12 08 36.33  Delta=+05 58 26.4  Mtime=02:04.8  Stime=12:21.3  Z=37.8  Focus=184.22
hd105373_550  Alpha=12 08 36.34  Delta=+05 58 25.7  Mtime=02:07.7  Stime=12:24.2  Z=37.8  Focus=184.22

hd105373_800  Alpha=12 08 36.34  Delta=+05 58 25.4  Mtime=02:10.1  Stime=12:26.6  Z=37.9  Focus=184.22
hd105373_800  Alpha=12 08 36.31  Delta=+05 58 25.0  Mtime=02:12.9  Stime=12:29.4  Z=37.9  Focus=184.22
0
drastega 3 Dez. 2013 im 16:05

3 Antworten

Beste Antwort
with open('your_file') as fin:
    data = (i for i in fin if not i.isspace())
    for row in data:
        row = next(data)
        # ... do something with every second non empty row

Ein anderer Weg (Unter Python2 möchten Sie möglicherweise izip verwenden, wenn die Datei groß ist.)

with open('your_file') as fin:
    for odd, even in zip(*[(i for i in fin if not i.isspace())]*2):
        # ... do something with even
2
John La Rooy 3 Dez. 2013 im 12:20

Nun, Sie können jeden zweiten, nicht leeren, wie folgt ausführen:

from itertools import islice

with open('your_file') as fin:
    non_blank = (line for line in fin if line.strip())
    every2 = islice(non_blank, 1, None, 2)
    for row in every2:
        # do something with row

Aber nicht sicher, wie Sie dann die Daten aus diesen Zeilen für die Verwendung in numpy extrahieren (sieht aus wie eine seltsame Menge von Werten darin).

1
Jon Clements 3 Dez. 2013 im 12:09

Verwenden Sie einen Hilfsgenerator:

def only_every_second_nonempty(iterator):
    yield_next_line = False  # Set to True if lines 1, 3, 5... should be returned
    for value in iterator:
        if not value.strip(): continue  # Skip empty line
        if yield_next_line:
            yield value
        yield_next_line = not yield_next_line

Jetzt können Sie die Datei mit so etwas durchgehen

with open('your_file') as f:
    for row in only_every_second_nonempty(f):
        ...
1
RemcoGerlich 3 Dez. 2013 im 12:23