2009-02-13 5 views
74

Sto cercando di determinare il modo migliore per gestire l'eliminazione di newline durante la lettura di file delimitati di nuova riga in Python.Il miglior metodo per leggere i file delimitati di nuova riga in Python e scartare le nuove linee?

Quello che mi è venuto in mente è il seguente codice, includere il codice throwaway da testare.

import os 

def getfile(filename,results): 
    f = open(filename) 
    filecontents = f.readlines() 
    for line in filecontents: 
    foo = line.strip('\n') 
    results.append(foo) 
    return results 

blahblah = [] 

getfile('/tmp/foo',blahblah) 

for x in blahblah: 
    print x 

suggerimenti?

+0

cosa sull'utilizzo di divisione ("/ n")? – jle

+1

Uguale a: http://stackoverflow.com/questions/339537/end-line-characters-from-lines-read-from-text-file-using-python –

+0

Penso che sarebbe meglio chiudere il file anche –

risposta

179
lines = open(filename).read().splitlines() 
+0

Questa risposta fa quello che stavo cercando, sono sicuro che avrò bisogno di aggiungere qualche controllo degli errori e così via, ma per questo specifico bisogno, è grandioso. Grazie a tutti per aver fornito le risposte! – solarce

+0

Mi piace ma come si chiude il file se non si salva l'handle del file? O è automaticamente chiuso? –

+6

Con CPython, il conteggio dei riferimenti per l'oggetto file andrà a zero una volta che non è più in uso e il file verrà automaticamente chiuso. Per implementazioni puramente GC'come Jython e IronPython, il file potrebbe non essere chiuso fino a quando non viene eseguito il GC, quindi questa variazione potrebbe non essere ottimale. –

8
for line in file('/tmp/foo'): 
    print line.strip('\n') 
+0

Questo ha funzionato perfettamente. Funziona anche per file più grandi. –

2

lo farei in questo modo:

f = open('test.txt') 
l = [l for l in f.readlines() if l.strip()] 
f.close() 
print l 
+0

Mentre la risposta di Curt Hagenlocher è tecnicamente migliore, questa risposta è un buon punto di partenza se è necessario aggiungere altre elaborazioni a ciascuna linea. – TomOnTime

+0

Non sono sicuro se si intendesse filtrare le righe vuote, ma questo è più conciso di '... se l.strip() non è ''', che è ciò di cui ho bisogno nel mio caso. –

20

Ecco un generatore che fa quello che avete richiesto. In questo caso, utilizzare rstrip è sufficiente e leggermente più veloce della striscia.

lines = (line.rstrip('\n') for line in open(filename)) 

Tuttavia, molto probabilmente vorrai usare questo per eliminare anche gli spazi vuoti finali.

lines = (line.rstrip() for line in open(filename)) 
+0

Non dovrebbe essere [] intorno al RHS, non()? – andrewb

+7

@andrewb Using() dà un'espressione di generatore, che non usa tanto memoria quanto usando [] (una comprensione di lista). –

3

Io uso questo

def cleaned(aFile): 
    for line in aFile: 
     yield line.strip() 

Allora posso fare cose come questa.

lines = list(cleaned(open("file","r"))) 

Oppure, posso estendere puliti con funzioni extra, per esempio, goccia righe vuote o saltare le linee di commento o qualsiasi altra cosa.

4

soli espressioni generatore uso:

blahblah = (l.rstrip() for l in open(filename)) 
for x in blahblah: 
    print x 

anche io voglio consigliarvi contro la lettura di tutto il file in memoria - ciclare su generatori è molto più efficiente su grandi insiemi di dati.

8

Cosa ne pensi di questo approccio?

with open(filename) as data: 
    datalines = (line.rstrip('\r\n') for line in data) 
    for line in datalines: 
     ...do something awesome... 

espressione Generator evita caricamento intero file in memoria e with garantisce la chiusura del file