python: come verificare se una riga è una riga vuota


87

Cercando di capire come scrivere un ciclo if per verificare se una riga è vuota.

Il file ha molte stringhe, e una di queste è una riga vuota da separare dalle altre istruzioni (non un ""; è un ritorno a capo seguito da un altro ritorno a capo, penso)

new statement
asdasdasd
asdasdasdasd

new statement
asdasdasdasd
asdasdasdasd

Dato che sto utilizzando il modulo di input file, c'è un modo per verificare se una riga è vuota?

Utilizzando questo codice sembra funzionare, grazie a tutti!

for line in x:

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

x.close()

Risposte:


132

Se vuoi ignorare le righe con solo spazi bianchi:

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

La stringa vuota è un valore False.

O se vuoi davvero solo righe vuote:

if line in ['\n', '\r\n']:
    ... do  something

la seconda fa quello che avevo in mente, grazie! se riga in ['\ n']:
user1006198

1
Se stai solo usando if line in ['\n'], dovresti sostituirlo con if line == '\n'.
Andrew Clark

8
Vorrei far notare che la risposta accettata ha un errore: if line.strip (): ... #do qualcosa ignora le righe con spazi, cioè spazio, tabulazione e riga vuota. Ecco perché solo il secondo ha funzionato per il poster originale: il "non" deve essere rimosso.
niefpaarschoenen

4
se non line.strip (): ... fai qualcosa. Non dovrebbe invece continuare? perché se non line.strip () in realtà significa che la riga è vuota quindi nulla può essere rimosso da essa, quindi ignorare o continuare. La prima parte non line.strip () cattura tutte le righe vuote
Dhiwakar Ravikumar

1
Sarebbe più pulito da usare al os.linesepposto di ['\n', '\r\n']?
Shawn

26

Uso il seguente codice per testare la riga vuota con o senza spazi bianchi.

if len(line.strip()) == 0 :
    # do something with empty line

11
line.strip() == ''

Oppure, se non vuoi "divorare" righe composte da spazi:

line in ('\n', '\r\n')

1
Nel secondo esempio probabilmente vorresti anche controllare per \r\ntenere conto delle terminazioni di riga in stile Windows (CRLF)
poplitea

ha dimenticato di dire che è in esecuzione su una macchina Unix, quindi utilizza la nuova riga senza \ r. L'ho provato ma non ha funzionato, cosa funziona per me: se la riga in ['\ n']: (nessun indizio sul perché la riga == "\ n" non funzionerà)
user1006198

1
@ user1006198: se stai solo controllando \n, allora line == '\n'è meglio. Probabilmente dovresti riprovare e capire qual era il tuo problema.
retracile

@ user1006198: (1) Leggere un file di testo creato da Windows su Unix ti darà \r\nse non lo stai usando mode='rU'(2) Ottieni un indizio: print repr(line)e se questo non fornisce un indizio, dicci esattamente cosa "non funziona" significa per te.
John Machin

L'unica spiegazione che ho è che probabilmente l'input del file fa qualcosa su ogni riga, perché quando faccio il confronto della riga con == non premo l'istruzione (stampando una stringa per vedere se colpisco la riga vuota , e con == non stampa mai la riga di debug, mentre lo fa quando uso "if line in").
user1006198


1

Penso che sia più robusto usare espressioni regolari:

import re

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

Ciò corrisponderebbe in Windows / unix. Inoltre, se non sei sicuro delle righe che contengono solo spazio, puoi usare '\s*\r?\n'come espressione

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.