2010-10-23 13 views
5

Tengo un archivo que he leído de que se parece a:Ignorar última n cuando se utiliza con el pitón readlines

1 value1 
2 value2 
3 value3 

El archivo puede o no tener un arrastre \ n en la última línea.

El código que estoy usando funciona muy bien, pero si hay un \ n nulo, falla.
¿Cuál es la mejor manera de detectar esto?

Mi código de referencia:

r=open(sys.argv[1], 'r'); 
for line in r.readlines(): 
    ref=line.split(); 
    print ref[0], ref[1] 

lo que fallaría con un:
Rastreo (llamada más reciente pasado):
Archivo "./test", línea 14, en
ref de impresión [ 0], referencia [1]
IndexError: índice de la lista fuera de rango

Respuesta

7

Usted puede pasar por alto las líneas que sólo contienen espacios en blanco:

for line in r.readlines(): 
    line = line.rstrip()  # Remove trailing whitespace. 
    if line:     # Only process non-empty lines. 
     ref = line.split(); 
     print ref[0], ref[1] 
+1

rstrip es redundante; split ignora el espacio en blanco líder/entrenamiento –

2

No creo que nos haya contado toda la historia. line.split() dará el mismo resultado, independientemente de si la última línea está terminada por \n o no.

Tenga en cuenta que la última línea en un archivo que se termina por \n es el comportamiento USUAL, y las personas a veces se molestan por una línea que no está terminada.

Si se va a hacer algo como:

print repr(line), repr(ref) 

en lugar de

print ref[0], ref[1] 

que sería capaz de detectar por sí mismo exactamente lo que está pasando, en vez de dejar que adivinar.

Si como conjetura @ Marcos Byers, su última línea está vacío o se compone sólo de los espacios en blanco, puede ignorar esa línea (y todas las otras líneas) por esta algo más sencillo código:

for line in r: # readlines is passe 
    ref = line.split() # split() ignores trailing whitespace 
    if ref: 
     print ref[0], ref[1] 

favor También considere la posibilidad de tener solo un campo, no 0 o 2, en su última línea.

+0

Creo que quiso decir que hay otra línea, que consiste únicamente en '\ n', al final ... (archivo que termina con" ... valor3 \ n \ n ") – Steven

Cuestiones relacionadas