2016-11-11 1 views
0

Ich würde gerne jede Datei durchlaufen, trimmen die Leerzeichen für jede Zeile, und löschen Sie die Zeile, wenn die zurückgegebene Zeichenfolge leer ist. Gibt es eine Möglichkeit zu vermeiden, den .strip() - Aufruf in der Liste Verständnis unten zu duplizieren? Es ist nicht leistungskritisch, aber es fühlt sich falsch an.Vermeiden von doppelten Funktionsaufruf in List Comprehension in Python

sub main(): 
    fname = "foo.txt" 
    lns = [] 

    with open(fname, 'r') as file: 
     lns = file.readlines() 

    newlns = [i.strip() + "\n" for i in lns if i.strip()] 
    #I want this to look like the following, which doesn't work: 
    #newlns = [y + "\n" for i in lns if i.strip() as y] 

    with open("out.txt", 'w') as file: 
     file.writelines(newlns) 

Antwort

3

Sie können eine verschachtelte Liste Verständnis verwenden (na ja, Generator Ausdruck in diesem Fall zu vermeiden, tatsächlich den Aufbau einer Liste):

newlns = [i + "\n" for i in (line.strip() for ln in lns) if i] 

In der Tat sollten Sie wirklich nicht einmal die Mühe, um die Datei zu lesen zuerst, gib es auch dort hinein: das Iterieren über eine Datei ergibt ihre Zeilen.

with open(fname, 'r') as file: 
    newlns = [i + "\n" for i in (line.strip() for ln in file) if i] 
+0

Danke für das Aufzeigen, dass ich den .readlines() Anruf nicht benötige! –

Verwandte Themen