lectura de archivos sin nuevas líneas en Python

En Python, llamar a

temp = open(filename,'r').readlines()

da como resultado una lista en la que cada elemento es una línea del fichero. Es un poco estúpido pero aún así: readlines() también escribe el carácter de nueva línea a cada elemento, algo que no deseo que ocurra.

¿Cómo puedo evitarlo?

Solución

Puede leer todo el archivo y dividir las líneas utilizando str.splitlines:

temp = file.read().splitlines()

O puede quitar la nueva línea a mano:

temp = [line[:-1] for line in file]

Nota: esta última solución sólo funciona si el archivo termina con una nueva línea, de lo contrario la última línea perderá un carácter.

Esta suposición es cierta en la mayoría de los casos (especialmente para los archivos creados por editores de texto, que a menudo añaden una nueva línea final de todos modos).

Si quiere evitar esto, puede añadir una nueva línea al final del archivo:

with open(the_file, 'r+') as f:
    f.seek(-1, 2)  # go at the end of the file
    if f.read(1) != '\n':
        # add missing newline if not already present
        f.write('\n')
        f.flush()
        f.seek(0)
    lines = [line[:-1] for line in f]

O una alternativa más sencilla es suprimir la nueva línea en su lugar:

[line.rstrip('\n') for line in file]

O incluso, aunque bastante ilegible:

[line[:-(line[-1] == '\n') or len(line)+1] for line in file]

Que aprovecha el hecho de que el valor de retorno de or no es un booleano, sino el objeto que se evaluó verdadero o falso.


El método readlines es en realidad equivalente a

def readlines(self):
    lines = []
    for line in iter(self.readline, ''):
        lines.append(line)
    return lines

# or equivalently

def readlines(self):
    lines = []
    while True:
        line = self.readline()
        if not line:
            break
        lines.append(line)
    return lines

Como readline() mantiene la nueva línea también readlines() la mantiene.

Nota: por simetría con readlines() el método writelines() no añade las nuevas líneas finales, así que f2.writelines(f.readlines()) produce una copia exacta de f en f2.

Comentarios (7)
temp = open(filename,'r').read().split('\n')
Comentarios (10)
def getText():
    file=open("ex1.txt","r");

    names=file.read().split("\n");
    for x,word in enumerate(names):
        if(len(word)>=20):
            return 0;
            print "length of ",word,"is over 20"
            break;
        if(x==20):
            return 0;
            break;
    else:
        return names;

def show(names):
    for word in names:
        len_set=len(set(word))
        print word," ",len_set

for i in range(1):

    names=getText();
    if(names!=0):
        show(names);
    else:
        break;
Comentarios (0)