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 :

Démarche optimale à adopter pour un script Python [Python 3.X]


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Bioinformaticien
    Inscrit en
    Septembre 2021
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2021
    Messages : 55
    Par défaut Démarche optimale à adopter pour un script Python
    Bonjour,

    Pour un programme en python qui assure entre autres le décodage de code, je récupère un recueil au format txt de chaque code que je peux rencontrer.
    Le fichier se présente tout simplement comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    code1    décodage1
    code2    décodage2
    code3    décodage3
    code4    décodage4
    code5    décodage5
    ...
    avec une tabulation entre chaque code/décodage.

    Je vois deux solutions pour exploiter ce fichier :

    option 1 : A chaque code rencontré par le programme, je parcours les lignes du txt depuis le début jusqu'à retrouver son décodage.

    option 2 : En début de script, grâce à une boucle qui parcours toutes les lignes je stocke les code/décodage dans une variable dictionnaire.


    A première vu la deuxième option semble évidente mais peut être avez vous une autre idée plus "propre" que ça, et sinon avez vous une idée de comment convertir ce fichier en dictionnaire plus simplement qu'en parcourant les lignes une à une ?
    Il s'agit d'un très gros fichier texte ( env. 700 000 lignes)

    merci d'avance !

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Salut,

    Citation Envoyé par ptrs32 Voir le message
    sinon avez vous une idée de comment convertir ce fichier en dictionnaire plus simplement qu'en parcourant les lignes une à une ?
    Il s'agit d'un très gros fichier texte ( env. 700 000 lignes)
    Un fichier texte est construit sur la base d'une séquence de lignes. Et détecter la fin de ligne, c'est balayer la suite d'octets jusqu'à la rencontrer. Et ce n'est qu'avec cette ligne que vous allez pouvoir séparer clef/valeur à ajouter au dictionnaire.
    Je n'ai aucune idée de combien de temps peut prendre la fabrication du dictionnaire (et la lecture du fichier) mais çà ne devrait pas dépasser une poignée de secondes (sur une machine normale): testez... et poser vous des questions si çà vous paraît long.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 202
    Par défaut
    hello,
    voici une solution possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    def writeBigFile():
        with open('bigFile.txt', 'w') as f:
            for i in range(1, 700000 ):
                f.write("code" + str(i) + "\tdécodage" + str(i))
                f.write('\n')
    
    def bigFile2dict():
        with open("bigFile.txt") as f:
            Dict = dict((x.strip(), y.strip())
                        for x, y in (line.split('\t')
                                     for line in f))
    #    print(Dict)
    
    print("début")
    writeBigFile()
    bigFile2dict()
    print("fin")

    Cela met une dizaine de secondes pour générer le fichier et le lire avec la conversion en dictionnaire. Le fichier généré fait dans les 18Mo. Je déconseille le print(Dict)

    Ami calmant, J.P

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    hello,
    Cela met une dizaine de secondes pour générer le fichier et le lire avec la conversion en dictionnaire.
    Ami calmant, J.P[/COLOR]
    Je trouve ça encore rapide pour un ZX81.

  5. #5
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 202
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Je trouve ça encore rapide pour un ZX81.
    je l'ai beaucoup boosté pour avoir des temps corrects.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 827
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par ptrs32 Voir le message
    Je vois deux solutions pour exploiter ce fichier :

    option 1 : A chaque code rencontré par le programme, je parcours les lignes du txt depuis le début jusqu'à retrouver son décodage.

    option 2 : En début de script, grâce à une boucle qui parcours toutes les lignes je stocke les code/décodage dans une variable dictionnaire.
    Un traitement qui prend ses données en mémoire sera 1000 fois plus rapide qu'un traitement qui doit les chercher dans un fichier. Mais en contrepartie il doit avoir l'espace mémoire suffisant pour tout stocker. C'est un dilemne que tous les devs se posent à chaque nouveau projet.

    Citation Envoyé par ptrs32 Voir le message
    et sinon avez vous une idée de comment convertir ce fichier en dictionnaire plus simplement qu'en parcourant les lignes une à une ?
    Impossible. Quelle que soit la méthode, elle devra passer par une lecture du fichier. Même si celle-ci est cachée dans une librairie "machin" qui se charge de tout mettre au propre, celle-ci passera obligatoirement par une lecture du fichier. Il y a des principes incontournables quand on traite un fichier et l'un deux c'est que pour traiter le fichier, il faut lire le fichier...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    J'entrevois plusieurs solutions, mais on manque d'informations pour savoir quelle est la meilleure.

    - avoir les données dans une base de données sqlite3 au lieu d'un fichier texte. Les extractions de données seront plus rapides.

    - lire le fichier texte une 1ère fois et créer un fichier d'index trié sur le code. La recherche est faite ensuite par dichotomie pour trouver le code et donc son décodage. A noter que si le fichier texte n'évolue pas entre 2 cessions, on peut stocker le fichier index sur disque et ne lire que lui à la cession suivante..

    - lire le fichier texte une 1ère fois et mettre en mémoire un dictionnaire dont la clé serait le code et sa valeur l'adresse disque du décodage. Même chose que précédemment: si le fichier texte n'évolue pas entre 2 cessions.

    - etc...

  8. #8
    Membre confirmé
    Homme Profil pro
    Bioinformaticien
    Inscrit en
    Septembre 2021
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2021
    Messages : 55
    Par défaut
    Alors déjà merci beaucoup pour tous vos retours,

    Merci jurassic pork pour ta proposition.

    Pour donner un peu plus d'infos ce fichier texte est récupérable sur internet, et il peut changer car il est régulièrement mis à jour, le date de dernière mise à jour est d’ailleurs en première ligne du fichier.

    Donc soit je re-crée mon dictionnaire à chaque run même si le fichier est le même que pour le précédent run. Ça ne devrait prendre qu'une poignée de secondes mais bon c'est un peu inutile.
    Soit je stocke ces données quelque part et je vérifie la date de mise à jour à chaque run pour déterminer si je dois re-créer le dictionnaire.

    Je dis peut être n'importe quoi mais est ce qu'il est envisageable de stocker le dictionnaire sous forme de chaine de caractère dans un txt, avec sa date de mise à jour, pour ensuite le récupérer dans mon script si cette date est identique ?

  9. #9
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Citation Envoyé par ptrs32 Voir le message
    Je dis peut être n'importe quoi mais est ce qu'il est envisageable de stocker le dictionnaire sous forme de chaine de caractère dans un txt, avec sa date de mise à jour, pour ensuite le récupérer dans mon script si cette date est identique ?
    Peut être voir du côté du format JSON ?

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Citation Envoyé par Arioch Voir le message
    Peut être voir du côté du format JSON ?
    ou de pickle...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Membre confirmé
    Homme Profil pro
    Bioinformaticien
    Inscrit en
    Septembre 2021
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2021
    Messages : 55
    Par défaut
    Finalement je converti le fichier texte en fichier JSON pour le stocker d'un run à un autre et dans le script je le passe en dictionnaire pour l'utiliser.

    Merci à tous pour vos propositions.

    Pour info, voici comment je récupère le fichier txt et crée le JSON :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    import urllib
     
    txtdata = list(urllib.request.urlopen(url))
     
    for line in txtdata:
          line = line.decode("utf-8").split('\t')
          dic[str(line[0].strip())] = str(line[1].strip())
     
    out_file = open("dicSave.json", "w")
    json.dump(dic, out_file, indent = 4, sort_keys = False)
    out_file.close()
    Si vous avez des remarques sur la syntaxe ou autre n'hésitez pas.
    Toujours bon d'améliorer l'écriture de son code.

  12. #12
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Citation Envoyé par ptrs32 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          dic[str(line[0].strip())] = str(line[1].strip())
    Si vous avez des remarques sur la syntaxe ou autre n'hésitez pas.
    Toujours bon d'améliorer l'écriture de son code.
    Je pense que tu n'as pas besoin de faire appel à la méthode strip() sur line[0].

    Chaque ligne de ton fichier est splitée mais le carriage return est en fin de ligne, pas au milieu

  13. #13
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Arioch Voir le message
    Je pense que tu n'as pas besoin de faire appel à la méthode strip() sur line[0].
    Ca dépend. Si cette partie de ligne contient des espaces inutiles (parce que strip() n'est pas fait que pour le '\n' )
    Sinon si c'est juste pour le "\n" alors rstrip() suffit et dans ce cas, autant le faire avant le split()...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  14. #14
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ca dépend. Si cette partie de ligne contient des espaces inutiles (parce que strip() n'est pas fait que pour le '\n' )
    J'ai tendance à oublier ce détail souvent, merci pour le rappel

    Donc, mettons que je n'ai rien dit en commentaire plus haut

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

Discussions similaires

  1. [Python 3.X] Problémes pour exécuter script python
    Par Steph37 dans le forum Général Python
    Réponses: 5
    Dernier message: 16/02/2021, 16h20
  2. Réponses: 0
    Dernier message: 03/02/2019, 20h16
  3. Réaliser un install pour un script python
    Par mcarluec dans le forum Déploiement/Installation
    Réponses: 13
    Dernier message: 15/04/2008, 08h14
  4. Les droits à adopter pour un script d'administration.
    Par Madmac dans le forum Administration système
    Réponses: 12
    Dernier message: 03/09/2006, 21h02
  5. Réponses: 5
    Dernier message: 20/07/2006, 01h17

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