En Python, appeler
temp = open(filename,'r').readlines()
donne une liste dans laquelle chaque élément est une ligne du fichier. C'est un peu stupide mais quand même : readlines()
écrit aussi un caractère de nouvelle ligne à chaque élément, ce que je ne souhaite pas voir se produire.
Comment puis-je l'éviter ?
Vous pouvez lire le fichier entier et séparer les lignes en utilisant str.splitlines
:
temp = file.read().splitlines()
Ou vous pouvez enlever la nouvelle ligne à la main :
temp = [line[:-1] for line in file]
Note: cette dernière solution ne fonctionne que si le fichier se termine par une nouvelle ligne, sinon la dernière ligne perdra un caractère.
Cette hypothèse est vraie dans la plupart des cas (en particulier pour les fichiers créés par des éditeurs de texte, qui souvent ajoutent de toute façon une nouvelle ligne à la fin).
Si vous voulez éviter cela, vous pouvez ajouter une nouvelle ligne à la fin du fichier :
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]
Ou une alternative plus simple est de strip
la nouvelle ligne à la place :
[line.rstrip('\n') for line in file]
Ou même, bien qu'assez illisible :
[line[:-(line[-1] == '\n') or len(line)+1] for line in file]
Ce qui exploite le fait que la valeur de retour de ou
n'est pas un booléen, mais l'objet qui a été évalué vrai ou faux.
La méthode readlines
est en fait équivalente à :
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
Puisque readline()
conserve la nouvelle ligne, readlines()
la conserve également.
*Remarque : par symétrie avec readlines()
, la méthode writelines()
n'ajoute pas* de nouvelles lignes de fin, donc f2.writelines(f.readlines())
produit une copie exacte de f
dans 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;