Clempython
Messages postés9Date d'inscriptionsamedi 26 décembre 2009StatutMembreDernière intervention29 mars 201117 3 janv. 2010 à 01:50
#la même chose en 10 fois plus court et rapide:
Liste = file("release_249.txt",'r')
lignes = Liste.readlines()
print len(lignes)
cs_Skami18
Messages postés1Date d'inscriptionjeudi 21 mai 2009StatutMembreDernière intervention12 juillet 2009 12 juil. 2009 à 13:23
Wééé super!
C'est pile ce qu'il me falait!
Merci :-)
cs_Julien39
Messages postés6414Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention29 juillet 2020371 2 mars 2009 à 00:08
cette source n'est pas tres interessante, néamoins, je comprends parfaitement qu'on ait envie de poster ses premiers codes, encore faudrait il qu'ils soient justes, je ne reviens pas sur les erreurs précédement expliquées. Tout de meme c'est beaucoup pour un code aussi simple, j'en ajoute une, tu ne refermes pas le fichier et utilise plutot open que file.
freecrazy
Messages postés1Date d'inscriptionvendredi 5 août 2005StatutMembreDernière intervention 1 mars 2009 1 mars 2009 à 11:04
Ces petits bouts de code, pour des petits pb sont toujours intéressants.
La différence de 1 vient simplement de l'initialisation de i=1 alors qu'on ne sait pas encore s'il y a une ligne ou non. Il faut l'initialiser à 0. D'ailleurs pour être "logique" jusqu'au bout je mettrai le i+=1 juste après le while.
Le gain de temps est impressionnant !
Cordialement
thibault7249
Messages postés21Date d'inscriptionlundi 2 juin 2008StatutMembreDernière intervention20 février 2009 3 févr. 2009 à 15:03
la différence de 1 entre les 2 nombres de lignes vient du fait que la dernière ligne est vide
enfin c'est ce que je pense
thibault7249
Messages postés21Date d'inscriptionlundi 2 juin 2008StatutMembreDernière intervention20 février 2009 3 févr. 2009 à 11:34
effectivement :D je te remercie !!! le temps de traitement est divisé par 4 :
import os, time
def countLigne(fichier):
Liste=file(fichier,'r')
i=1
Ligne=Liste.readline()
# "Tant que la ligne n'est pas egale a "" "
# ==> tant qu'on est pas arrive a la fin
while Ligne!="":
#on lit une ligne
Ligne=Liste.readline()
#on ajoute 1 a notre competeur
i+=1
#on retourne le compteur
return i
def countLigne2(fichier):
for i, ligne in enumerate(open(fichier,'r')):
pass
i += 1
return i
a = time.clock()
print countLigne(fichier)
b= time.clock()-a
print b
a = time.clock()
print countLigne2(fichier)
b= time.clock()-a
print b
Resultats :
1448915
2.49478299616
1448914
0.653769124288
Je dois en conclure que pour ce type d'itération on préfèrera une boucle "for" ?
lespinx
Messages postés106Date d'inscriptionlundi 9 octobre 2006StatutMembreDernière intervention23 novembre 202277 3 févr. 2009 à 11:07
Bonjour,
1)
Utiliser "readlines" au lieu de "readline". La méthode "readlines" renvoie toutes les lignes du fichier dans une liste.
Il ne reste plus qu'a appliquer la méthode "len(liste)" pour obtenir le nombre d'éléments de la liste donc le nombre d'enregistrements du fichier.
Exemple
# -*- coding: ISO-8859-15 -*-
import os , time
# FONCTION RENVOYANT LE NOMBRE DE LIGNES D'UN FICHIER TEXTE
def countLigne(fichier):
Liste=file(fichier,'r')
## i=1
i=Liste.readlines()
## # "Tant que la ligne n'est pas égale à "" "
## # ==> tant qu'on est pas arrivé à la fin
## while Ligne!="":
## #on lit une ligne
## Ligne=Liste.readline()
## #on ajoute 1 à notre compteur
## i+=1
#on retourne le compteur
return i
#on note que sous windows le symbole "" doit etre doublé quand il y a certains caractères
2)La mème chose avec une écriture plus pythonesque
i = len(open(fichier,'r').readlines())
print "nb_lignes",i
L'inconvénient de cette méthode est que le fichier est chargé totalement en mémoire.
3)N'ayant pas sous la main un fichier de plus d'un million d'enregistrements pour faire des tests, je joins un exemple tiré d'un livre "Python par l'exemple (O'Reilly)", réputé plus rapide et adapté pour de très gros fichiers.
for i, ligne in enumerate(open(fichier,'r')):
pass
i += 1
print "nb_lignes",i
Le fichier est lu ligne par ligne dans une boucle "for"
Le compteur "i" est incrémenté par la méthode "enumerate"
La méthode "enumerate" enumère de 0 a n c'est la raison pour laquelle on fait i += 1
3 janv. 2010 à 01:50
Liste = file("release_249.txt",'r')
lignes = Liste.readlines()
print len(lignes)
12 juil. 2009 à 13:23
C'est pile ce qu'il me falait!
Merci :-)
2 mars 2009 à 00:08
1 mars 2009 à 11:04
La différence de 1 vient simplement de l'initialisation de i=1 alors qu'on ne sait pas encore s'il y a une ligne ou non. Il faut l'initialiser à 0. D'ailleurs pour être "logique" jusqu'au bout je mettrai le i+=1 juste après le while.
Le gain de temps est impressionnant !
Cordialement
3 févr. 2009 à 15:03
enfin c'est ce que je pense
3 févr. 2009 à 11:34
import os, time
def countLigne(fichier):
Liste=file(fichier,'r')
i=1
Ligne=Liste.readline()
# "Tant que la ligne n'est pas egale a "" "
# ==> tant qu'on est pas arrive a la fin
while Ligne!="":
#on lit une ligne
Ligne=Liste.readline()
#on ajoute 1 a notre competeur
i+=1
#on retourne le compteur
return i
def countLigne2(fichier):
for i, ligne in enumerate(open(fichier,'r')):
pass
i += 1
return i
a = time.clock()
print countLigne(fichier)
b= time.clock()-a
print b
a = time.clock()
print countLigne2(fichier)
b= time.clock()-a
print b
Resultats :
1448915
2.49478299616
1448914
0.653769124288
Je dois en conclure que pour ce type d'itération on préfèrera une boucle "for" ?
3 févr. 2009 à 11:07
1)
Utiliser "readlines" au lieu de "readline". La méthode "readlines" renvoie toutes les lignes du fichier dans une liste.
Il ne reste plus qu'a appliquer la méthode "len(liste)" pour obtenir le nombre d'éléments de la liste donc le nombre d'enregistrements du fichier.
Exemple
# -*- coding: ISO-8859-15 -*-
import os , time
# FONCTION RENVOYANT LE NOMBRE DE LIGNES D'UN FICHIER TEXTE
def countLigne(fichier):
Liste=file(fichier,'r')
## i=1
i=Liste.readlines()
## # "Tant que la ligne n'est pas égale à "" "
## # ==> tant qu'on est pas arrivé à la fin
## while Ligne!="":
## #on lit une ligne
## Ligne=Liste.readline()
## #on ajoute 1 à notre compteur
## i+=1
#on retourne le compteur
return i
#on note que sous windows le symbole "" doit etre doublé quand il y a certains caractères
2)La mème chose avec une écriture plus pythonesque
i = len(open(fichier,'r').readlines())
print "nb_lignes",i
L'inconvénient de cette méthode est que le fichier est chargé totalement en mémoire.
3)N'ayant pas sous la main un fichier de plus d'un million d'enregistrements pour faire des tests, je joins un exemple tiré d'un livre "Python par l'exemple (O'Reilly)", réputé plus rapide et adapté pour de très gros fichiers.
for i, ligne in enumerate(open(fichier,'r')):
pass
i += 1
print "nb_lignes",i
Le fichier est lu ligne par ligne dans une boucle "for"
Le compteur "i" est incrémenté par la méthode "enumerate"
La méthode "enumerate" enumère de 0 a n c'est la raison pour laquelle on fait i += 1
Alors bons tests.
Cordialement.