OVH Cloud OVH Cloud

Cherche une classe COMPTEUR ou assimile ?

9 réponses
Avatar
martin
Bonjour,

Je cherche une classe Compteur en python.
Pour l'instant je travaille avec ceci :

Merci par avance

def incremente_compteur (fichier="C:\Program Files\Pdf2word\Compteur.ini",
increment=1):
"""Incremente (par default de 1) le compteur du fichier.
Sauvegarde la nouvelle valeure dans le ficheir.
Retourne le nouveau conteur.
"""
f=open(fichier, "r+", 0)
valeur=int(f.read())
valeur=valeur+increment
f.seek(0,0)
f.write(str(valeur))
f.close()
return valeur

9 réponses

Avatar
Jerome
martin wrote:
Bonjour,

Je cherche une classe Compteur en python.
Pour l'instant je travaille avec ceci :

Merci par avance





Et écrire ta propre classe compteur ? Ca prend 3 lignes de python.

Avatar
F. Petitjean
Bonjour,

Je cherche une classe Compteur en python.
Pour l'instant je travaille avec ceci :

Merci par avance

def incremente_compteur (fichier="C:Program FilesPdf2wordCompteur.ini",
Aie aie on est mal parti utilisez « / » comme séparateur ou un

littéral r"..."
increment=1):
"""Incremente (par default de 1) le compteur du fichier.
Sauvegarde la nouvelle valeure dans le ficheir.
Retourne le nouveau conteur.
"""
f=open(fichier, "r+", 0)
valeur=int(f.read())
valeur=valeur+increment
f.seek(0,0)
f.write(str(valeur))
f.close()
return valeur

Je ne comprends pas : vous demandez une classe Compteur et vous proposez

une fonction !
Pourquoi pas une classe Compteur avec un attribut de classe value ?
Et comme je suis d'humeur tâtillonne ce soir, je remarque que vous
stockez la valeur courante dans un fichier sous une forme ASCII mais
sans fin de ligne, ce n'est pas très logique : soit vous stockez en
binaire (plus de transformation valeur=int(f.read() ou str(valeur)
pour l'écritue, soit vous conservez une forme ASCII (.INI par exemple)
mais alors vous faites l'effort de gérer de vraies lignes de texte avec
une fin de ligne 'n'.

Avatar
Jean-michel
"F. Petitjean" a écrit dans le message de news:
42544cff$0$13591$
Bonjour,

Je cherche une classe Compteur en python.
Pour l'instant je travaille avec ceci :

Merci par avance

def incremente_compteur (fichier="C:Program
FilesPdf2wordCompteur.ini",
Aie aie on est mal parti utilisez « / » comme séparateur ou un

littéral r"..."
increment=1):
"""Incremente (par default de 1) le compteur du fichier.
Sauvegarde la nouvelle valeure dans le ficheir.
Retourne le nouveau conteur.
"""
f=open(fichier, "r+", 0)
valeur=int(f.read())
valeur=valeur+increment
f.seek(0,0)
f.write(str(valeur))
f.close()
return valeur

Je ne comprends pas : vous demandez une classe Compteur et vous proposez

une fonction !
Pourquoi pas une classe Compteur avec un attribut de classe value ?
Et comme je suis d'humeur tâtillonne ce soir, je remarque que vous
stockez la valeur courante dans un fichier sous une forme ASCII mais
sans fin de ligne, ce n'est pas très logique : soit vous stockez en
binaire (plus de transformation valeur=int(f.read() ou str(valeur)
pour l'écritue, soit vous conservez une forme ASCII (.INI par exemple)
mais alors vous faites l'effort de gérer de vraies lignes de texte avec
une fin de ligne 'n'.


Bonsoir,
Pourquoi ne pas sauver la valeur avec le module pickle (exemple:
pickle.dump(objet,file('nom_fichier','w')) ou voir l'exemple dans la doc
standard) ?
Ca évite de se poser des questions de format et permet de sauver/restaurer
un objet Python.
jm


Avatar
F. Petitjean

Bonsoir,
Pourquoi ne pas sauver la valeur avec le module pickle (exemple:
pickle.dump(objet,file('nom_fichier','w')) ou voir l'exemple dans la doc
standard) ?
Ca évite de se poser des questions de format et permet de sauver/restaurer
un objet Python.
jm

Effectivement, je n'avais pas pensé à suggérer cette méthode.

Merci Jean-Michel

Avatar
David Josty
"F. Petitjean" a écrit dans le message de
news:42544cff$0$13591$
Bonjour,

Je cherche une classe Compteur en python.
Pour l'instant je travaille avec ceci :

Merci par avance

def incremente_compteur (fichier="C:Program
FilesPdf2wordCompteur.ini",


Aie aie on est mal parti utilisez « / » comme séparateur ou un
littéral r"..."
increment=1):
"""Incremente (par default de 1) le compteur du fichier.
Sauvegarde la nouvelle valeure dans le ficheir.
Retourne le nouveau conteur.
"""
f=open(fichier, "r+", 0)
valeur=int(f.read())
valeur=valeur+increment
f.seek(0,0)
f.write(str(valeur))
f.close()
return valeur

Je ne comprends pas : vous demandez une classe Compteur et vous proposez

une fonction !
Pourquoi pas une classe Compteur avec un attribut de classe value ?
Et comme je suis d'humeur tâtillonne ce soir, je remarque que vous
stockez la valeur courante dans un fichier sous une forme ASCII mais
sans fin de ligne, ce n'est pas très logique : soit vous stockez en
binaire (plus de transformation valeur=int(f.read() ou str(valeur)
pour l'écritue, soit vous conservez une forme ASCII (.INI par exemple)
mais alors vous faites l'effort de gérer de vraies lignes de texte avec
une fin de ligne 'n'.


Merci pour votre aide, je m'explique.
Effectivement, je demande une classe, et je propose une fonction.
En effet, je ne suis pas tres a l'aise avec les classes, donc je presente
une fonction bricolée,
qui fonctionne afin d'éclairée d'avantage d'avantage sur mon besoin.
Peux être pouvez vous me conseiller sur un site web expliquant les classes
en python !
Merci pour soutient


Avatar
Jerome


Merci pour votre aide, je m'explique.
Effectivement, je demande une classe, et je propose une fonction.
En effet, je ne suis pas tres a l'aise avec les classes, donc je presente
une fonction bricolée,
qui fonctionne afin d'éclairée d'avantage d'avantage sur mon besoin.
Peux être pouvez vous me conseiller sur un site web expliquant les classes
en python !
Merci pour soutient




http://docs.python.org/tut/node11.html...

Mais pour apprendre à programmer en objet, il suffit d'un bon cours
d'objet, pas un cours de python forcément. Google est ton ami.

Bon courage

Avatar
jb
Bonsoir,

J'ai un petit script qui pourrait faire ce que tu demandes, et vu qu'il
y a des gourous python sur cette liste, j'espere avoir des indications sur
comment améliorer mon prog qui n'est peut etre pas tres pythonesque et pas
tres efficient. Pour un compteur, pas de risques de surcharge de cpu ;) mais
ce serait interessant de savoir ou ca pourrait pecher

Adaptes le a tes besoins et voila

J'attends vos commentaires

MErci


Julien




# Fichier Compteur.py
import os

class CompteurSimple:

# Compteur simple
#
# basé sur un fichier texte
# met a jour le fichier a chaque incrementation
#
# A utiliser comme ca d'un autre module :
#
# import Compteur
#
# monCompteur=Compteur.CompteurSimple("NomDuFichierOuStockerLeCompte")
#
#

def __init__(self,baseFile="compteur"):
# initialisation du compteur
self.compte=0
self.fileNameºseFile
self._initCompteur()
def _initCompteur(self):
# lit le fichier pour recuperer la valeur actuelle
# laisse a zero sinon
if os.path.exists(self.fileName):
try:
self.compte=int(file(self.fileName,'r').readlines()[0])
except:
pass

def __str__(self):
# surcharge de str
return str(self.compte)

def getCompte(self):
# autre methode qui retoure le compte
return str(self)

def increment(self,inc=1):
# incremente le coompteur puis rafraichit le fichier
self.compte+=inc
self._writeCompteur()

def _writeCompteur(self):
# ecrit le fichier
cpt = file(self.fileName,'w')
cpt.write(str(self.compte))
cpt.close()


if __name__=="__main__":
# test du module
cpt=CompteurSimple()
print cpt
print "compteur : %s" % cpt
cpt.increment()
print "compteur : %s" % cpt
cpt.increment(5)
print "compteur : %s" % cpt
Avatar
F. Petitjean
Bonsoir,

Pour un compteur, pas de risques de surcharge de cpu ;) mais
ce serait interessant de savoir ou ca pourrait pecher

Adaptes le a tes besoins et voila

J'attends vos commentaires
puisque vous le demandez ...


MErci


Julien




# Fichier Compteur.py
Mettre deux lignes essentielles : la ligne #! (shebang) et la ligne

contenant « l'encoding cookie »
#!/usr/bin/env python
# -*- coding: latin-1 -*-

'''
ce module blah blah
'''

__all__ = ('CompteurSimple',) # au cas où on voudrait faire
# from ... import *
import os

class CompteurSimple:
class CompteurSimple(object):

"""
# Compteur simple
#
# basé sur un fichier texte
# met a jour le fichier a chaque incrementation
#
# A utiliser comme ca d'un autre module :
#
# import Compteur
#
# monCompteur=Compteur.CompteurSimple("NomDuFichierOuStockerLeCompte")
#
#
"""

et éventuellement mettre un copier-coller d'une session interactive
utilisant cette classe pour ensuite simplement appeler doctest.

def __init__(self,baseFile="compteur"):
"""CompteurSimple([baseFile, [start]]) -> a simple counter

"""
# les « doc strings » ce n'est pas fait pour les chiens
# et pourquoi ne pas avoir un paramètre start=0 ?
# initialisation du compteur
self.compte=0
self.compte = start

self.fileNameºseFile
self._initCompteur()

def _initCompteur(self):
'''lit le fichier pour récupérer la valeur actuelle.

laisse à zéro sinon.
'''
if os.path.exists(self.fileName):
try:
self.compte=int(file(self.fileName,'r').readlines()[0])
except:
pass
Arg! vous combinez deux techniques différentes pour traiter (mal) le

problème d'accès au fichier (pas de fichier ou pas de droits pour lire)
Lisez les explications du MartelliBot :
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52291
et vous commetez les péchés véniels d'ouvrir avec file et non open et
de ne pas fermer le fichier. Vous récidivez en commettant le péché grave
d'utiliser « rxcept » non suivi de la classe d'exception. Cela fait
beaucoup pour 5 lignes de code, vous ne trouvez pas ?
try:
fin = open(self.fileName)
except IOError:
# si c'est un problème de droit, on est mal parti
import errno
if exc.errno == errno.ENOENT:
return # pas de fichier ? pas de problème : (en
# supposant qu'on le créera plus tard)
raise
line = fin.readline() # une ligne devrait suffire
fin.close()
try:
self.compte = int(line)
except ValueError:
pass # on pourrait se poser la question du caractère
cavalier de la démarche qui consiste à écraser un fichier
dont on sait qu'il ne convient pas. Je serais tenté de lever
une exception BadFile('file %s is not a counter' % self.fileName)

def __str__(self):
# surcharge de str
C'est une bonne idée

return str(self.compte)

def getCompte(self):
# autre methode qui retoure le compte
return str(self)

def increment(self,inc=1):
# incremente le coompteur puis rafraichit le fichier
self.compte+=inc
Passez pylint (de logilab) et vous aurez un avertissemnt sur cette ligne

self._writeCompteur()

def _writeCompteur(self):
# ecrit le fichier
cpt = file(self.fileName,'w')
cpt = open(self.fileName,'w')

cpt.write(str(self.compte))
ARg: la ligne n'est pas complète sans fin de ligne.

cpt.write(str(self.compte) + 'n')
cpt.close()


if __name__=="__main__":
# test du module
cpt=CompteurSimple()
print cpt
print "compteur : %s" % cpt
cpt.increment()
print "compteur : %s" % cpt
cpt.increment(5)
print "compteur : %s" % cpt

Essayez pylint et il vous affichera pas mal de choses. Sur un script

aussi simple et aussi court vous pouvez obtenir 8 sur 10 en ajoutant les
élements indiqués dans les avertissements : doc strings, ...

Cordialement

Avatar
jb
Essayez pylint et il vous affichera pas mal de choses. Sur un script
aussi simple et aussi court vous pouvez obtenir 8 sur 10 en ajoutant les
élements indiqués dans les avertissements : doc strings, ...


Merci pour tous ces conseils !!

Cordialement


Cordialement,


Julien