python: jak sprawdzić, czy linia jest pusta

86

Próbuję wymyślić, jak napisać cykl if, aby sprawdzić, czy linia jest pusta.

Plik ma wiele ciągów, a jeden z nich jest pustą linią do oddzielenia od innych instrukcji (nie jest ""; to powrót karetki, po którym następuje inny znak powrotu karetki, jak sądzę)

new statement
asdasdasd
asdasdasdasd

new statement
asdasdasdasd
asdasdasdasd

Ponieważ używam modułu wejściowego pliku, czy istnieje sposób sprawdzenia, czy wiersz jest pusty?

Używanie tego kodu wydaje się działać, dziękuję wszystkim!

for line in x:

    if line == '\n':
        print "found an end of line"

x.close()
user1006198
źródło

Odpowiedzi:

128

Jeśli chcesz ignorować wiersze zawierające tylko białe znaki:

if not line.strip():
    ... do something

Pusty ciąg to wartość Fałsz.

Lub jeśli naprawdę chcesz tylko puste wiersze:

if line in ['\n', '\r\n']:
    ... do  something
wsteczny
źródło
drugi robi to, co miałem na myśli, dzięki! if line in ['\ n']:
user1006198,
1
Jeśli używasz tylko if line in ['\n'], powinieneś zamienić to na if line == '\n'.
Andrew Clark,
7
Chciałbym zwrócić uwagę, że zaakceptowana odpowiedź zawiera błąd: if line.strip (): ... #do something ignoruje linie z białymi znakami, tj. Spacja, tabulator i pusta linia. Dlatego tylko ten drugi zadziałał na oryginalnym plakacie: „nie” trzeba usunąć.
niefpaarschoenen
3
jeśli nie line.strip (): ... zrób coś. Czy nie powinno zamiast tego kontynuować? ponieważ jeśli nie, to line.strip () w rzeczywistości oznacza, że ​​linia jest pusta, więc nic nie może zostać z niej usunięte, stąd ignoruj ​​lub kontynuuj. Pierwsza część, a nie line.strip () przechwytuje wszystkie puste wiersze
Dhiwakar Ravikumar
1
Czy byłoby czystsze w użyciu os.linesepzamiast ['\n', '\r\n']?
Shawn
24

Używam następującego kodu, aby przetestować pusty wiersz ze spacjami lub bez nich.

if len(line.strip()) == 0 :
    # do something with empty line
bevardgisuser
źródło
11
line.strip() == ''

Lub, jeśli nie chcesz „zjadać” wierszy składających się ze spacji:

line in ('\n', '\r\n')
Fred Foo
źródło
1
W drugiej próbce, którą prawdopodobnie chciałbyś również sprawdzić, \r\naby uwzględnić zakończenia linii w stylu Windows (CRLF)
poplitea
zapomniałem wspomnieć, że to działa na komputerze z Uniksem, więc używa nowej linii bez \ r. Wypróbowałeś, ale to nie zadziałało, co działa dla mnie: jeśli linia w ['\ n']: (nie ma pojęcia, dlaczego linia == "\ n" nie działa)
user1006198
1
@ user1006198: jeśli tylko sprawdzasz \n, to line == '\n'jest lepiej. Prawdopodobnie powinieneś spróbować ponownie i dowiedzieć się, na czym polegał problem.
retracile
@ user1006198: (1) Czytanie pliku tekstowego utworzonego w systemie Windows na Uniksie da ci, \r\njeśli nie używasz mode='rU'(2) Uzyskaj wskazówkę: print repr(line)a jeśli to nie daje wskazówki, powiedz nam dokładnie, co "nie działa" znaczy dla ciebie.
John Machin,
Jedynym wyjaśnieniem jakie mam jest to, że prawdopodobnie plik wejściowy robi coś dla każdej linii, ponieważ kiedy robię porównanie linii z == nie trafiam w instrukcję (wypisuje ciąg, żeby zobaczyć czy trafiłem w pusty wiersz , aw przypadku == nigdy nie wypisuje wiersza debugowania, podczas gdy robi to, gdy używam "if line in").
user1006198
2

Powinieneś otwierać pliki tekstowe za pomocą, rUaby znaki nowego wiersza były poprawnie przekształcane, zobacz http://docs.python.org/library/functions.html#open . W ten sposób nie ma potrzeby sprawdzania \r\n.

hochl
źródło
próbowałem otworzyć, ale uważam, że wejście do pliku jest bardziej odpowiednie dla mojego przypadku
user1006198
5
Należy również zauważyć, że Uargument nie jest obsługiwany w python3.
jtwilson,
1

Myślę, że bardziej niezawodne jest użycie wyrażeń regularnych:

import re

for i, line in enumerate(content):
    print line if not (re.match('\r?\n', line)) else pass

To pasowałoby w Windows / unix. Ponadto, jeśli nie jesteś pewien co do wierszy zawierających tylko znaki spacji, możesz użyć ich '\s*\r?\n'jako wyrażenia

alemol
źródło