2009-02-13 16 views
74

Estoy tratando de determinar la mejor manera de deshacerse de las líneas nuevas cuando lea en archivos delimitados por líneas nuevas en Python.¿El mejor método para leer archivos delimitados por líneas nuevas en Python y descartar las nuevas líneas?

Lo que he encontrado es el siguiente código, incluye código desechable para probar.

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 

Sugerencias?

+0

lo que acerca del uso de división ("/ n")? – jle

+1

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

+0

Creo que sería mejor cerrar el archivo también –

Respuesta

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

Esta respuesta es lo que estaba buscando, estoy seguro de que tendré que agregar algunas comprobaciones de errores y demás, pero para esta necesidad específica, es genial. ¡Gracias a todos por proporcionar respuestas! – solarce

+0

Me gusta esto, pero ¿cómo cierras el archivo si no guardas el manejador del archivo? ¿O está cerrado automáticamente? –

+6

Con CPython, el recuento de referencias para el objeto de archivo se pondrá a cero una vez que ya no esté en uso y el archivo se cerrará automáticamente. Para implementaciones puramente GC'd como Jython e IronPython, es posible que el archivo no se cierre hasta que se ejecute el GC, por lo que esta breve variación puede no ser óptima. –

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

Esto funcionó perfectamente. Funciona para archivos más grandes también. –

2

lo haría así:

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

Si bien la respuesta de Curt Hagenlocher es técnicamente mejor, esta respuesta es un buen punto de partida si necesita agregar otro procesamiento a cada línea. – TomOnTime

+0

No estoy seguro si fue para filtrar líneas en blanco, pero esto es más conciso que '... si l.strip() no es ''', que es lo que necesito en mi caso. –

20

Aquí es un generador que hace lo que solicitó. En este caso, usar rstrip es suficiente y ligeramente más rápido que strip.

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

Sin embargo, lo más probable es que también desee utilizar esto para deshacerse de los espacios en blanco al final.

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

¿No debería ser [] alrededor de la RHS, no()? – andrewb

+7

@andrewb Using() da una expresión de generador, que no utiliza tanta memoria como el uso de [] (una lista de comprensión). –

3

Yo uso este

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

entonces puedo hacer cosas como esta.

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

O, yo puede prolongar limpiado con funciones adicionales para, por ejemplo, la caída de líneas en blanco o Omitir líneas de comentario o lo que sea.

4

A sólo expresiones generadoras de empleo:

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

También quiero aconsejarle en contra de leer todo el archivo en la memoria - bucle sobre los generadores es mucho más eficiente en grandes conjuntos de datos.

8

¿Qué opina de este enfoque?

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

expresión generadora evita cargar todo el archivo en la memoria y with asegura de cerrar el archivo

Cuestiones relacionadas