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.
4 Réponses :
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>
Ça a marché. Merci beaucoup. Je ne savais pas qu'il s'agissait d'une double lecture. Merci beaucoup.
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.
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.
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
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.
# 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.
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
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.