2012-09-08 20 views
192

En Python, llamandoLa lectura de un archivo sin saltos de línea

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

resultados en una lista en la que cada elemento es una línea en el archivo. Es un poco estúpido, pero aún así: readlines() también escribe carácter de nueva línea para cada elemento, algo que no deseo que suceda. ¿Cómo puedo evitarlo?

+2

Uso tira: '[l.strip ('\ n \ r') para l en temp]'. O incluso 'rstrip'. Y desde la iteración aquí puede ser 'in open' en lugar de' in temp'. – gorlum0

+13

Esta pregunta es responsable de cada puntaje de reputación que tengo – Yotam

+3

Sería bueno si en Python 3 hubiera un valor para establecer el argumento 'newline' de open en las líneas nuevas tramadas. – jxramos

Respuesta

276

Puedes leer las líneas de archivo y división usando str.splitlines:

temp = file.read().splitlines() 

O puede despojar a la nueva línea con la mano:

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

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

Este supuesto es cierto en la mayoría de los casos (especialmente para los archivos creados por los editores de texto, que a menudo qué añadir una nueva línea que termina de todos modos).

Si desea evitar esto se puede agregar 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 consiste en strip 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 explota el hecho de que el retorno va lue de or no es un booleano, sino el objeto que se evaluó como verdadero o falso.


El método readlines es realmente 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 

Desde readline() mantiene el salto de línea también readlines() lo mantiene.

Nota: de simetría para readlines() el método writelines() hace no añadir saltos de línea que termina, por lo f2.writelines(f.readlines()) produce una copia exacta de f en f2.

+0

Tenga en cuenta que '' [line.rstrip ('\ n') for line in file] '' eliminará más de un '' \ n'' posterior. –

+0

Más simplemente, '' [línea [:-(línea [-1] == '\ n') o len (línea) +1] para línea en archivo] '' podría ser en su lugar '' [línea [:-(línea [-1] == '\ n') o Ninguno] para línea en archivo] ''. –

+0

Estas soluciones leen todo el archivo en la memoria. Cambiar los corchetes de una lista de comprensión a paréntesis hace una expresión generadora que le permite iterar sobre el archivo una línea a la vez: 'for line in (x.strip() para x en f):' – velotron

19
temp = open(filename,'r').read().split('\n') 
+8

¿Qué sucedería con las líneas nuevas '\ r \ n'? ;) – Wolph

+0

@WoLpH Sí, no tomé las nuevas líneas específicas de la plataforma en cuenta. Dará lo equivocado. – vivek

+11

Python maneja automáticamente nuevas líneas universales, por lo tanto '.split ('\ n')' se dividirá correctamente, independientemente de la convención de nueva línea. Sería importante si lee el archivo en modo binario. En ese caso, 'splitlines()' maneja las nuevas líneas universales, mientras que 'split ('\ n')' no lo hace. – Bakuriu

-2
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; 
1
import csv 

with open(filename) as f: 
    csvreader = csv.reader(f) 
    for line in csvreader: 
     print(line[0]) 
2
temp = open(filename,'r').read().splitlines() 
0

Prueba esto:

u=open("url.txt","r") 
url=u.read().replace('\n','') 
print(url) 
+1

Si bien este fragmento de código puede resolver la pregunta, [incluyendo una explicación] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. Por favor, intente no saturar su código con comentarios explicativos, ya que esto reduce la legibilidad tanto del código como de las explicaciones. – FrankerZ

Cuestiones relacionadas