salut,
Merci pour votre réponse,
Le code en principe fonctionne parfaitement en revanche le seule truc qui manque ce que le code prend en considération les valeurs nuls donc le calcul de la moyenne est *faux*. Je voudrais juste savoir si je dois insérer les valeurs de la moyenne dans une list pour que je puisse les présentées graphiquement par plot().
on peut y arriver facilement en lisant le fichier ligne à ligne,
rstrip() permet de virer les fins de lignes, et pour vérifier qu'une ligne est vide on peut s'en remettre à une petite regex
le seul truc un peu pénible c'est que le
$ symbolise le début d'une série de valeurs plutôt que la fin, mais comme on a pas de délimiteur spécifique on est obligé de l'utiliser pour déterminer la fin d'une série de valeurs
du coup il faut traiter le premier
$ pour ne rien faire, et le cas où l'on a pas de
$ qui termine le fichier, auquel cas on aurait des résultats non affichés :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import re
with open('fichier.txt', 'r') as f:
first_time, n, total = True, 0, 0
for l in f:
line = l.rstrip() # on vire les fins de lignes
if not re.match(r'^[ \t]*$', line): # on s'assure que la ligne n'est pas vide
if line == '$':
if first_time: # c'est le premier dollar qu'on rencontre ?
first_time = False # si oui on le zappe
continue
else: # sinon on affiche les resultats
print 'n = {}, total = {}, moyenne = {:.6f}'.format(n , total, total/n)
n, total = 0, 0 # et on reinitialise les compteurs
else: # si c'est pas un dollar, alors c'est une valeur
n += 1
total += float(line) # si c'est pas un nombre le programme plantera
if n: # derniere occurrence
print 'n = {}, total = {}, moyenne = {:.6f}'.format(n , total, total/n) |
note dans le cas où on a autre chose sur la ligne qu'un dollar, des espaces ou une valeur numérique, le programme plantera immanquablement
si on veut s'assurer que ça fonctionne à tous les coups on peut prendre le problème dans l'autre sens et uniquement spécifier les lignes valides (plutôt qu'interdire les lignes non-valides)
il suffira de modifier un peu la regex comme suit :
1 2
| - if not re.match(r'^[ \t]*$', line):
+ if re.match(r'^\$|\d+(?:\.\d+)?$', line): |
Partager