web-dev-qa-db-fra.com

Comment faire en boucle jusqu'à la fin d'un fichier en Python sans vérifier la ligne vide?

J'écris une tâche pour compter le nombre de voyelles dans un fichier. Actuellement, dans ma classe, nous utilisons seulement un code comme celui-ci pour vérifier la fin d'un fichier:

vowel=0
f=open("filename.txt","r",encoding="utf-8" )
line=f.readline().strip()
while line!="":
    for j in range (len(line)):
        if line[j].isvowel():
            vowel+=1

    line=f.readline().strip()

Mais cette fois, pour notre travail, le fichier d'entrée fourni par notre professeur est un essai complet. Il y a donc plusieurs lignes vierges dans le texte pour séparer les paragraphes et ainsi de suite, ce qui signifie que mon code actuel ne compterait que jusqu'à la première ligne vierge.

Existe-t-il un moyen de vérifier si mon fichier est arrivé à sa fin, si ce n'est de vérifier si la ligne est vide? De préférence, de la même manière que mon code actuellement, où il vérifie quelque chose à chaque itération de la boucle while

Merci d'avance

4
ay lmao

Ne parcourez pas un fichier de cette façon. Utilisez plutôt une boucle for.

for line in f:
    vowel += sum(ch.isvowel() for ch in line)

En fait, tout votre programme est juste:

VOWELS = {'A','E','I','O','U','a','e','i','o','u'}
# I'm assuming this is what isvowel checks, unless you're doing something
# fancy to check if 'y' is a vowel
with open('filename.txt') as f:
    vowel = sum(ch in VOWELS for line in f for ch in line.strip())

Cela dit, si vous voulez vraiment continuer à utiliser une boucle while pour une raison erronée:

while True:
    line = f.readline().strip()
    if line == '':
        # either end of file or just a blank line.....
        # we'll assume EOF, because we don't have a choice with the while loop!
        break
18
Adam Smith

Trouver la position finale du fichier:

f = open("file.txt","r")
f.seek(0,2) #Jumps to the end
f.tell()    #Give you the end location (characters from start)
f.seek(0)   #Jump to the beginning of the file again

Ensuite, vous pouvez:

if line == '' and f.tell() == endLocation:
   break
0
Punnerud