1
votes

Lire le contenu d'un fichier avec une boucle for en Python

Voici le problème. J'ai un fichier names.txt. Le contenu de ce fichier comme suit. La question demande d'afficher les nombres de noms dans ce fichier. Je pourrais faire avec la boucle while . Ça marche, pas de problème. Mais pour une raison quelconque, si je voulais faire cela avec la boucle for , cela me donne un nombre incorrect de noms.

There are  3.0 names in the names.txt file. 

C'est la boucle while. Il fonctionne parfaitement.

def main():
    try:
        # open the names.txt file in read mode.
        infile=open("names.txt", "r")

        # set an accumulator for number of names
        numbers_of_name=0.0

        # read the rest of the file
        for line in infile:
            line=infile.readline()
            numbers_of_name+=1

        # print the numbers of names in the names.txt file.    
        print("There are ", numbers_of_name, "names in the names.txt file.")

        # close the file
        infile.close()
    except IOError as err:
        print (err) 

# call the main function
main()

La console me donne la bonne réponse.

There are 6 names in the names.txt file.

Et c'est ma problématique pour la boucle p>

def main():
    try:
        # open the names.txt file in read mode.
        infile=open("names.txt", "r")

        # set an accumulator for number of names
        numbers_of_name=0.0

        # read the first line
        line=infile.readline()

        # read the rest of the file
        while line!="":
            numbers_of_name+=1
            line=infile.readline()

        # print the numbers of names in the names.txt file.    
        print("There are", int(numbers_of_name), "names in the names.txt file.")

        # close the file
        infile.close()
    except IOError as err:
        print (err) 

# call the main function
main()

Et voici la sortie.

    Julia Roberts 
    Michael Scott
    Kevin Malone
    Jim Halpert
    Pam Halpert
    Dwight Schrute

Il devrait y avoir 6 noms et non 3 noms .:

Quelle partie pourrait manquer dans ce code de lecture de fichier? Merci d'avance.


1 commentaires

Les objets de fichier Infile ont déjà le contenu et chaque ligne du contenu est considérée comme un élément de liste car ils sont séparés par une nouvelle ligne.


4 Réponses :


6
votes

Le problème est que vous lisez deux lignes dans chaque itération, lorsque vous faites:

for line in infile:
    numbers_of_name+=1

La ligne est la première ligne du fichier, lorsque vous faites:

line.readline()

Ensuite, la ligne est maintenant la deuxième ligne, puis vous ajoutez un deux que vous nommez

Vous devriez faire:

for line in infile:

p>


1 commentaires

Ça a marché. Merci beaucoup. Je ne savais pas qu'il s'agissait d'une double lecture. Merci beaucoup.



1
votes

Cette ligne unique réalisera ce que vous essayez de faire avec tout ce code:

len(open("names.txt", "r").readlines())

Une boucle n'est pas nécessaire pour compter le nombre de lignes.


3 commentaires

Ce n'est pas la raison pour laquelle le questionneur a posé la question. Il est bien conscient de ce qui fonctionne, il demande pourquoi sa boucle for ne fonctionne pas


Hmm. Cela a fonctionné aussi. Je vais chapitre par chapitre dans mon livre "Tony Gaddis - Commencer avec Python 3rd Edition". Pas encore arrivé en fonction len. Peut-être que c'est dans le chapitre "Listes". Merci cela a fonctionné aussi.


@ycx Le questionneur n'a pas indiqué qu'il savait ce qui fonctionnait. Leur but final est: "La question demande d'afficher des nombres de noms dans ce fichier". Si la question indiquait que seules les boucles for doivent être utilisées, il serait logique de limiter les réponses à cela uniquement.



2
votes

Le problème vient de cette section

# read the rest of the file
for i, line in enumerate(infile):
    print (i, line)
    line=infile.readline()
    print (i, line)
    numbers_of_name+=1

Si vous faites une impression en coupe, vous verrez pourquoi:

# read the rest of the file
for line in infile:
    line=infile.readline()
    numbers_of_name+=1

En faisant line = infile.readline () , vous modifiez la valeur de line dans la boucle for et la modifiez pour le passage de boucle suivant


1 commentaires

Ok maintenant je vois. Donc, fondamentalement, pour la ligne dans le fichier lit déjà le fichier. Merci pour les fonctions d'impression pour me le rendre visible. Je l'ai maintenant.



2
votes
# Initialise count
count = 0
with open('bar.py', 'r') as fd:
  # Strip newline char and and any leading/trailing spaces
  lines = map(lambda x: x.strip(), fd.readlines())

  # Strip empty lines
  lines = filter(lambda x: x, lines)

  # Get the count
  count = len(lines)
print "Count: ", count
Note: With map and filter being used, we're iterating over the list twice. An efficient implementation (for a large list) would be to iterate over the elements just once and apply conditions to eliminate unwanted entries - empty lines, lines starting with #, etc.

2 commentaires

Merci. C'est probablement une solution avancée. Je suis débutant en Python. Je ne suis pas encore au courant de ce lambda . Mais merci cependant. J'apprécie beaucoup.


Python lambda sont des fonctions sans nom - généralement des one-liners. Plus d'informations sur w3schools.com/python/python_lambda.asp