2008-12-04 22 views

Respuesta

44

El idiomática manera de hacer esto en Python es usar rstrip ('\ n'):

for line in open('myfile.txt'): # opened in text-mode; all EOLs are converted to '\n' 
    line = line.rstrip('\n') 
    process(line) 

Cada una de las otras alternativas tiene un Gotcha:

  • file ('...'). read(). splitlines() tiene que cargar todo el archivo en la memoria a la vez.
  • línea = línea [: - 1] fallará si la última línea no tiene EOL. Hace
+15

HTTP y otros protocolos especifican '\ r \ n' para terminaciones de línea, por lo que debe usar line.rstrip ('\ r \ n') para mayor robustez. –

+0

¡Gracias por tu ayuda! Necesitaba abrir un archivo de texto y me sorprendió ver que la \ n - cosa está incluso en Python, ya que está en Perl, C y en muchos otros idiomas. Lo marcaré como favorito y nunca lo olvidaré. – bjd2385

5

¿Qué pasa con su código? Encuentro que es bastante elegante y simple. El único problema es que si el archivo no termina en una nueva línea, la última línea devuelta no tendrá un '\n' como el último carácter y, por lo tanto, al hacer line = line[:-1] se borrará incorrectamente el último carácter de la línea.

La forma más elegante de resolver este problema sería definir un generador que tomó las líneas del archivo y se elimina el último carácter de cada línea sólo si ese personaje es una nueva línea:

def strip_trailing_newlines(file): 
    for line in file: 
     if line[-1] == '\n': 
      yield line[:-1] 
     else: 
      yield line 

f = open("myFile.txt", "r") 
for line in strip_trailing_newlines(f): 
    # do something with line 
+3

archivos de Mac que utilizan '\ r', Windows utiliza '\ r \ n', que empieza a ser algo pesada. Es mucho mejor usar str.rstrip() –

+2

Si el archivo se abre en modo texto, las terminaciones de línea nativas de la plataforma se convierten automáticamente en una sola '\ n' a medida que se leen. Y solo _muy antiguo_ los Mac OS usan plain '\ r '. No puede usar rstrip() si desea retener espacios y pestañas finales. –

+0

Buena idea, con el generador. Sería útil en una biblioteca reutilizable. Combinaría su solución con la solución de efonitis (para guardar el if: else :). Sin la biblioteca reutilizable a mano, preferiría la solución de efotinis (usando line.rstrip ('\ n')). – pythonquick

17

simple. Utilice splitlines()

L = open("myFile.txt", "r").read().splitlines(); 
for line in L: 
    process(line) # this 'line' will not have '\n' character at the end 
+4

Pero tenga en cuenta que esto primero carga todo el archivo en la memoria, lo que puede hacerlo inadecuado para algunas situaciones. –

+0

@Matthew: Sí, tienes razón. –

+1

lo hace exactamente correcto para mí, gracias –

2

También puede considerar el uso de line.rstrip() para eliminar los espacios en blanco al final de la línea.

+0

También uso rstrip(), pero debe tener en cuenta que también elimina espacios y pestañas finales –

+0

Como ha demostrado efotinis, si especifica el argumento de caracteres, puede especificar qué Desnudarse. De la documentación: "" "rstrip ([chars]) El argumento chars es una cadena que especifica el conjunto de caracteres que se eliminarán. Si se omite o None, el argumento chars se predetermina para eliminar espacios en blanco." "" – monkut

3

largo tiempo, no había querido, viejo código limpio, y básico que podría ejecutarse en máquinas básicas 16 kb: así:

if (not open(1,"file.txt")) error "Could not open 'file.txt' for reading" 
while(not eof(1)) 
    line input #1 a$ 
    print a$ 
wend 
close 

Ahora, para leer un archivo línea por línea, con mucho mejor hardware y software (Python), hay que reinventar la rueda:

def line_input (file): 
    for line in file: 
     if line[-1] == '\n': 
      yield line[:-1] 
     else: 
      yield line 

f = open("myFile.txt", "r") 
for line_input(f): 
    # do something with line 

estoy inducido a pensar que algo ha ido por el camino equivocado en alguna parte ...

+1

Si bien, considerando que python es nuestra mejor opción para un lenguaje interpretado de nivel básico, estoy de acuerdo con este comentario, podría ser conveniente notar que 16kb BASIC con una frase WHILE nunca fueron comunes. – arivero

3

¿Qué piensa 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