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?
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
.
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;