Frage

Ich versuche, eine Datei mit einer Liste Verständnis ähnelt der Verwendung von Code zu teilen:

lines = [x for x in re.split(r"\n+", file.read()) if not re.match(r"com", x)]

Allerdings hat die Linien Liste immer eine leere Zeichenfolge als letztes Element. Kennt jemand eine Möglichkeit, dies zu vermeiden (mit Ausnahme der cludge des Setzens eines pop () danach)?

War es hilfreich?

Lösung

Setzen Sie den regulären Ausdruck Hammer weg: -)

  1. Sie können direkt über eine Datei durchlaufen; readlines() ist fast veraltet in diesen Tagen.
  2. Lesen Sie mehr über str.strip() (und seine Freunde, lstrip() und rstrip()) .
  3. Verwenden Sie keine file als Variablennamen. Es ist schlechter Stil, weil file ein ist eingebaute Funktion .

Sie können den Code wie schreiben:

lines = []
f = open(filename)
for line in f:
    if not line.startswith('com'):
        lines.append(line.strip())

Wenn Sie noch leere Zeilen in es immer, Sie in einem Test hinzufügen können:

lines = []
f = open(filename)
for line in f:
    if line.strip() and not line.startswith('com'):
        lines.append(line.strip())

Wenn Sie es wirklich wollen in einer Zeile ein:

lines = [line.strip() for line in open(filename) if line.strip() and not line.startswith('com')]

Wenn Sie schließlich auf Python sind 2.6, Blick auf die mit Anweisung , um die Dinge zu verbessern, ein wenig mehr.

Andere Tipps

Linien = file.readlines ()

Bearbeiten oder wenn Sie dort Leerzeilen wollen nicht, können Sie

Linien = Filter (Lambda a: (a = '\ n'), file.readlines ()!)

Bearbeiten ^ 2: Hinter newines zu entfernen, können Sie

lines = [re.sub ( '\ n', '', Zeile) für Leitungsfilter in (lambda a: (a = '\ n'), file.readlines ())]

ein weiterer praktischer Trick, vor allem, wenn Sie die Zeilennummer benötigen, ist enumerate zu verwenden:


fp = open("myfile.txt", "r")
for n, line in enumerate(fp.readlines()):
    dosomethingwith(n, line)

Ich fand nur etwa erst vor kurzem aus aufzählen, aber es hat sich seitdem praktisch schon ein paar Mal kommen.

Das sollte funktionieren, und die Beseitigung der regulären Ausdrücke wie auch:

all_lines = (line.rstrip()
             for line in open(filename)
             if "com" not in line)
# filter out the empty lines
lines = filter(lambda x : x, all_lines)

Da Sie eine Liste Verständnis verwenden und nicht einen Generator Ausdruck (so die gesamte Datei in den Speicher geladen wird sowieso), hier ist eine Abkürzung, die Code vermeidet Leerzeilen, um herauszufiltern:

lines = [line
     for line in open(filename).read().splitlines()
     if "com" not in line]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top