2010-03-03 124 views
14

Per esempio, noi abbiamo qualche file del genere:Come eliminare tutte le righe vuote nel file con l'aiuto di python?

prima linea
seconda linea

terza linea

E in conseguenza dobbiamo ottenere:

prima riga
seconda riga
terza linea

Usa SOLO pitone

+5

Condividi le tue idee e tentativi. Cercheremo di aiutarti. –

+3

In realtà è banale con grep, ad es. 'grep -v '^ $' file' –

+1

Dovrebbe funzionare sia con win che con linux, quindi possiamo usare SOLO python, no grep =) – user285070

risposta

22
import fileinput 
for line in fileinput.FileInput("file",inplace=1): 
    if line.rstrip(): 
     print line 
+1

+1 per rilevare anche linee che contengono spazi bianchi e nient'altro. –

+2

Questo cambierà per la formattazione degli spazi bianchi anche nelle buone linee –

+1

non capisco, come che formattazione? cura di elaborare? – ghostdog74

1
>>> s = """first line 
... second line 
... 
... third line 
... """ 
>>> print '\n'.join([i for i in s.split('\n') if len(i) > 0]) 
first line 
second line 
third line 
>>> 
+0

Dipende da cosa vuol dire "vuoto" - funziona solo se vuoto significa "niente affatto". Se ci sono spazi tra la seconda riga e la terza linea, ciò fallirà. Inoltre ha bisogno di lavorare sui file :) Ma mi piace il fatto che non è necessario importare espressioni regolari :) – Chirael

+0

@Chirael - per questo caso è possibile aggiungere solo len (i.strip())> 0 –

4

So che hai chiesto di Python, ma i suoi commenti su Win e Linux indica che si sta dopo cross-platform-ness, e Perl è almeno come multipiattaforma come Python. È possibile farlo facilmente con una riga di Perl sulla riga di comando, senza script: perl -ne 'print if /\S/' foo.txt

(adoro Python e lo preferisco a Perl il 99% delle volte, ma a volte vorrei davvero poter eseguire la riga di comando script con esso come è possibile con il -e passare a Perl!)

Detto questo, il seguente script Python dovrebbe funzionare. Se ti aspetti di farlo spesso o per file di grandi dimensioni, dovrebbe essere ottimizzato con la compilazione anche delle espressioni regolari.

#!/usr/bin/python 
import re 
file = open('foo.txt', 'r') 
for line in file.readlines(): 
    if re.search('\S', line): print line, 
file.close() 

Ci sono molti modi per farlo, questo è solo uno :)

+2

È possibile eseguire script della riga di comando con python usando il flag '-c'. Sfortunatamente dovresti usare più linee (o separare con;) per leggere dallo standard input. –

20

La dichiarazione with è eccellente per l'apertura e chiusura di file automaticamente.

with open('myfile','rw') as file: 
    for line in file: 
     if not line.isspace(): 
      file.write(line) 
+4

+1 per l'uso di "with" e buona, iterazione pythonic attraverso le linee, oltre a non mutare le buone linee di output. –

+2

Sembra che tu debba aprire myfile con 'r +' flag invece di 'rw' secondo https://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files – furins

+2

Questa soluzione sembra come se avesse problemi di buffer/sovrascrittura per qualsiasi file più grande della dimensione del buffer di input. E se no, qualcuno può spiegare perché? –

7
import sys 
with open("file.txt") as f: 
    for line in f: 
     if not line.isspace(): 
      sys.stdout.write(line) 

Un altro modo è

with open("file.txt") as f: 
    print "".join(line for line in f if not line.isspace()) 
0

Hai provato qualcosa come il programma di seguito?

for line in open(filename): 
    if len(line) > 1 or line != '\n': 
     print(line, end='') 
0

È possibile utilizzare sotto modo per eliminare tutte le righe vuote:

with open("new_file","r") as f: 
for i in f.readlines(): 
     if not i.strip(): 
      continue 
     if i: 
      print i, 

Possiamo anche scrivere l'output su file usando sotto modo:

with open("new_file","r") as f, open("outfile.txt","w") as outfile: 
for i in f.readlines(): 
     if not i.strip(): 
      continue 
     if i: 
      outfile.write(i)    
Problemi correlati