IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Faisabilité Numérotation unique


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 237
    Par défaut Faisabilité Numérotation unique
    Bonsoir à tous,

    Je souhaite écrire des fichiers dans lesquels chaque début de ligne commencera par un numéro unique pour cela je pensais enregistrer l'heure au format numérique sur la première ligne puis ajouter +1 à chaque nouvelle ligne. Ainsi aucune ligne de mes fichier aurait le même numéro

    Pouvez vous me dire si c'est possible et si oui comment ?

    Bien sûr si il existe une méthode plus simple je suis preneur.

    Merci de votre aide.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    ben, chaque ligne possède déjà un numéro unique dans le fichier ...
    celui de sa position dans le fichier ... non ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 237
    Par défaut
    oui, mais comme j'ai plusieurs fichiers, je vais avoir plusieurs numéro de lignes identiques, or je souhaite un numéro unique par ligne et par fichier

  4. #4
    Membre éclairé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Billets dans le blog
    1
    Par défaut
    Tu peux ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str( int( round( time.time()*1000 )))
    au début de chaque ligne : ça change toutes les millisecondes (sans oublier le "import time" qui va bien).
    A moins de vraiment pas de chance, tu ne devrais pas avoir de ligne ayant le même numéro.

    Sinon, tu peux aussi ajouter un hash du nom de fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str(long(hashlib.md5(filename).hexdigest(),16)&0xffffffff)
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import hashlib
    filename='nom_de_fichier.txt'
    avant.

    Hadrien

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    Citation Envoyé par jouclar Voir le message
    oui, mais comme j'ai plusieurs fichiers, je vais avoir plusieurs numéro de lignes identiques, or je souhaite un numéro unique par ligne et par fichier
    c'est comme les lignes ... chaque fichier a un nom différent dans le même répertoire.

    quelle est l'utilité de "différencier en dur" chaque ligne ?

    bon, c'est valable sur un systeme ordonné; si je prend 2 fichier au hasard, théoriquement on peut retrouver les même numéros/même ligne.

  6. #6
    Membre éclairé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Billets dans le blog
    1
    Par défaut
    La solution ultime :

    concatener
    - un hash (md5 ou sha1 par ex) du chemin+nom de fichier
    - une date (exprimée en millisec depuis une date de réf (genre 1/1/1970))
    - un numéro qui s'incrémente à chaque appel (pour différencier des lignes ayant la même date au millisec près)

    Bien sûr, tu peux tomber sur une collision de hash...
    Tu as raison pfeuh, coder en se disant "boarfl... ce serait vraiment pas de bol que ça ne marche pas..." est une abhération toute pure !
    Toutefois, la garantie d'unicité est justement un des problèmes qui a ses limites.
    Où alors : adresse mac de la carte réseau + chemin complet (non "hashé")...
    Mais il regarder le rapport : risque de collision / prix d'une collision

    Hadrien

  7. #7
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 237
    Par défaut
    Merci de vos réponses.

    J'ai laissé tomber l'idée.

  8. #8
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    supposons que tu écrives 700 lignes à la seconde 123456. Tu vas donc avoir les numéros de ligne de 12345600 à 12346299. Puis 10 secondes plus tard, tu refais le même coup pour un autre fichier, tes nouvelles lignes vont commencer à 12345610 et donc avoir des identifiants communs aux anciennes lignes.

    un simple classe avec une méthode get() peut te tirer d'affaire. Un problème apparait quand ton programme s'arrête et recommence, car les identifiants vont repartir de 1. Il faut alors initialiser l'instance de la classe avec le prochain identifiant unique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class serialNumber():
        def __init__(self, initvalue= 1):
            self.current_number = initvalue
        def get(self):
            value = self.current_number
            self.current_number += 1
            return value
     
    if __name__ == '__main__':
     
    sn = serialNumber(123456)
    for counter in range(20):
        print sn.get()
    Citation Envoyé par Captain'Flam Voir le message
    A moins de vraiment pas de chance, tu ne devrais pas avoir de ligne ayant le même numéro.
    Sois sûr que si tu laisses dans un soft la plus infime possibilité de bug, il va se produire.

    A+

    Pfeuh

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Position des balises H2 ou comment les numéroter
    Par haypo dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 12/07/2003, 19h24
  2. Unique + valeur par défaut
    Par ketalie dans le forum Outils
    Réponses: 4
    Dernier message: 02/07/2003, 15h29
  3. Réponses: 4
    Dernier message: 22/05/2003, 11h15
  4. Suppression de la contrainte unique
    Par mika dans le forum SQL
    Réponses: 3
    Dernier message: 20/02/2003, 17h56
  5. Question de faisabilité
    Par lisarasu dans le forum CORBA
    Réponses: 3
    Dernier message: 14/05/2002, 11h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo