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 :

Script demande optimisation


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 46
    Par défaut Script demande optimisation
    Bonjour,

    Je me présente, Thomas, je suis technicien informatique. Chaque jour, nous recevons un certain nombre de fichiers (traces) que nous devons sauvegarder dans un dossier puis mettre en partage dans un autre.

    Je me suis donc dit qu'un petit script en Python pourrait automatiser tout sa et me permettrais de démarrer mon apprentissage.

    Voici le code fonctionnel ou je suis arrivé :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    #!/usr/bin/python
    # -*- coding: latin-1 -* 
     
    ### Importation des modules nécessaires ###
     
    import os
    import glob
    import datetime
    import shutil
     
    ### Récupération date j-1 et formatage ###
     
    date_nametrace = (datetime.date.today()-datetime.timedelta(1)).strftime('%Y-%m-%d') # date à J-1 et formatage pour le nom des fichiers #
    name_file = '*_{0}.zip'.format(date_nametrace) # création du nom des fichiers #
    today_year = datetime.date.today().strftime('%Y') # Pour nom du dossier (année) #
    today_yearmonth = (datetime.date.today()-datetime.timedelta(1)).strftime('%Y-%m') # Pour nom du dossier (année + mois) #
    today_daymonthyear = (datetime.date.today()-datetime.timedelta(1)).strftime('%d-%m-%Y') # Pour nom du dossier (jours + année + mois) #
     
    ### Définition répertoire source et arrivé N2C ###
     
    source_n2c = os.path.join("*******","N2","N2C") 
    dest_n2c = os.path.join("*******","N2","N2C",today_year,today_yearmonth,today_daymonthyear)
    dest_n2c_partage = os.path.join("*****","N2",today_yearmonth,today_daymonthyear)
     
    ### Transfert traces N2C ###
     
    if os.path.isdir(source_n2c): # Vérification de l'existance du dossier #
    		os.chdir(source_n2c) # Placement dans le bon dossier #
    		print('Nous sommes dans : {0}'.format(os.getcwd())) # Indique le dossier dans lequel nous sommes #
    		list_trace_n2c = glob.glob(name_file) # Enregistrement des fichiers dans une liste pour opération #
    		print('Nombre de traces : ', len(list_trace_n2c))
    		for x in list_trace_n2c: 
    			if os.path.isfile(x): # Si fichier exist #
    				shutil.copy(x, dest_n2c) # Copi de celui ci dans le dossier sur le ******** #
    				shutil.move(x, dest_n2c_partage) # Cut de celui ci dans le dossier de partage #
    				print('Le fichier {0} à été transféré'.format(x))
    			else:
    				print('Il n\'y a pas de fichier trace')
    else:
    	print('Ce dossier n\'existe pas')
     
    ### Définition répertoire source et arrivé N2M ###	
     
    source_n2m = os.path.join("************","N2","N2M")
    dest_n2m = os.path.join("*************","N2","N2M",today_year,today_yearmonth,today_daymonthyear)
    dest_n2m_partage = os.path.join("***********","N2M",today_yearmonth,today_daymonthyear)
     
    ### Transfert traces N2M ###
     
    if os.path.isdir(source_n2m):
    	os.chdir(source_n2m)
    	print('Nous sommes dans : {0}'.format(os.getcwd()))
    	list_trace_n2m = glob.glob(name_file)
    	print('Nombre de traces : ', len(list_trace_n2m))
    	for x in list_trace_n2m:
    		if os.path.isfile(x):
    			shutil.copy(x, dest_n2m)
    			shutil.move(x, dest_n2m_partage)
    			print('Le fichier {0} à été transféré'.format(x))
    		else:
    			print('Il n\'y a pas de fichier trace')
    else:
    	print('Ce dossier n\'existe pas')
    Je voudrais donc avoir vos avis sur ce code ? Y'a t'il des portions améliorable ? Des techniques plus pratique que celle employé ?

    Enfin, j'aimerais tester la copie des fichiers, savoir si le shutil.copy et .move ont bien fonctionné, auriez vous des indications sur comment procéder ? J'ai pensé à lui faire faire un glob.glob du dossier cible et de compter le nombre de fichier (car on en as normalement toujours le même nombre) et de comparé les deux listes par exemple.

    Egalement, j'aimerais ajouter un petit fichier log ou il écrit le résultat, qu'elle fichier on été copier etc ... Qu'elle est la méthode pour faire, ouvrir le fichier.log avant, puis lui demandé d'écrire dedans dans la boucle if de copie des fichier ?

    Cordialement,
    Thomas.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 822
    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 822
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par BUENOO Voir le message
    Bonjour,

    Je me présente, Thomas, je suis technicien informatique. Chaque jour, nous recevons un certain nombre de fichiers (traces) que nous devons sauvegarder dans un dossier puis mettre en partage dans un autre.

    Je me suis donc dit qu'un petit script en Python pourrait automatiser tout sa et me permettrais de démarrer mon apprentissage.

    Voici le code fonctionnel ou je suis arrivé :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    #!/usr/bin/python
    # -*- coding: latin-1 -* 
     
    ### Importation des modules nécessaires ###
     
    import os
    import glob
    import datetime
    import shutil
     
    ### Récupération date j-1 et formatage ###
     
    date_nametrace = (datetime.date.today()-datetime.timedelta(1)).strftime('%Y-%m-%d') # date à J-1 et formatage pour le nom des fichiers #
    name_file = '*_{0}.zip'.format(date_nametrace) # création du nom des fichiers #
    today_year = datetime.date.today().strftime('%Y') # Pour nom du dossier (année) #
    today_yearmonth = (datetime.date.today()-datetime.timedelta(1)).strftime('%Y-%m') # Pour nom du dossier (année + mois) #
    today_daymonthyear = (datetime.date.today()-datetime.timedelta(1)).strftime('%d-%m-%Y') # Pour nom du dossier (jours + année + mois) #
     
    ### Définition répertoire source et arrivé N2C ###
     
    source_n2c = os.path.join("*******","N2","N2C") 
    dest_n2c = os.path.join("*******","N2","N2C",today_year,today_yearmonth,today_daymonthyear)
    dest_n2c_partage = os.path.join("*****","N2",today_yearmonth,today_daymonthyear)
     
    ### Transfert traces N2C ###
     
    if os.path.isdir(source_n2c): # Vérification de l'existance du dossier #
    		os.chdir(source_n2c) # Placement dans le bon dossier #
    		print('Nous sommes dans : {0}'.format(os.getcwd())) # Indique le dossier dans lequel nous sommes #
    		list_trace_n2c = glob.glob(name_file) # Enregistrement des fichiers dans une liste pour opération #
    		print('Nombre de traces : ', len(list_trace_n2c))
    		for x in list_trace_n2c: 
    			if os.path.isfile(x): # Si fichier exist #
    				shutil.copy(x, dest_n2c) # Copi de celui ci dans le dossier sur le ******** #
    				shutil.move(x, dest_n2c_partage) # Cut de celui ci dans le dossier de partage #
    				print('Le fichier {0} à été transféré'.format(x))
    			else:
    				print('Il n\'y a pas de fichier trace')
    else:
    	print('Ce dossier n\'existe pas')
     
    ### Définition répertoire source et arrivé N2M ###	
     
    source_n2m = os.path.join("************","N2","N2M")
    dest_n2m = os.path.join("*************","N2","N2M",today_year,today_yearmonth,today_daymonthyear)
    dest_n2m_partage = os.path.join("***********","N2M",today_yearmonth,today_daymonthyear)
     
    ### Transfert traces N2M ###
     
    if os.path.isdir(source_n2m):
    	os.chdir(source_n2m)
    	print('Nous sommes dans : {0}'.format(os.getcwd()))
    	list_trace_n2m = glob.glob(name_file)
    	print('Nombre de traces : ', len(list_trace_n2m))
    	for x in list_trace_n2m:
    		if os.path.isfile(x):
    			shutil.copy(x, dest_n2m)
    			shutil.move(x, dest_n2m_partage)
    			print('Le fichier {0} à été transféré'.format(x))
    		else:
    			print('Il n\'y a pas de fichier trace')
    else:
    	print('Ce dossier n\'existe pas')
    Je voudrais donc avoir vos avis sur ce code ? Y'a t'il des portions améliorable ? Des techniques plus pratique que celle employé ?
    Salut
    Tu as remarqué que ta structure de travail sur les dossiers n2c et n2m est la même ???
    Pourquoi ne pas créer une fonction dédiée à ce travail et l'appeler avec n2c puis n2m ???
    Accessoirement on n'est pas obligé de se placer dans un dossier pour y travailler...

    Citation Envoyé par BUENOO Voir le message
    Enfin, j'aimerais tester la copie des fichiers, savoir si le shutil.copy et .move ont bien fonctionné, auriez vous des indications sur comment procéder ? J'ai pensé à lui faire faire un glob.glob du dossier cible et de compter le nombre de fichier (car on en as normalement toujours le même nombre) et de comparé les deux listes par exemple.
    Tu fais un hash md5 du fichier source et destination et tu compares les deux hash...

    Citation Envoyé par BUENOO Voir le message
    Citation Envoyé par BUENOO Voir le message
    Je me présente, Thomas, je suis technicien informatique.
    Egalement, j'aimerais ajouter un petit fichier log ou il écrit le résultat, qu'elle fichier on été copier etc ... Qu'elle est la méthode pour faire, ouvrir le fichier.log avant, puis lui demandé d'écrire dedans dans la boucle if de copie des fichier ?
    "boucle if" pffff...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a=open("fichier_de_celui_qui_invente_la_boucle_if", "w")
    for i in range(100):
        a.write("la structure de contrôle if n'est pas une boucle (la preuve: break n'y a pas d'effet)\n")
    a.close()
    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]

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 058
    Par défaut
    Tu fais un hash md5 du fichier source et destination et tu compares les deux hash...
    Autre solution, un try-except IOError

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 46
    Par défaut
    Bonjour,

    Merci pour vos réponse Alors j'ai implémenté le Try/Except, c'est parfait pour mon besoin

    @Sve@r : Pardon, ma structure conditonnel !! Concernant le fait de ne pas avoir besoin de se trouver dans le dossier pour y faire des opérations, j'étais au courant, mais mon problème est venu du module glob, j'ai pas réussi à trouver comment fair un glob en utilisant un chemin contenu dans une variable. Si tu as une idée de comment fair je suis preneur ,)
    Enfin, pourrais tu me montrer un petit exemple pour la fonction, je présumes que tu parles du : def. Mais j'ai un peu de mal à voir comment faire sa ...

    EDIT : Voilà ce que j'ai fait avec la fonction :
    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
     
    import os
    import datetime
    import glob
    import shutil
     
    def chemin_source(x):
        date_nametrace = (datetime.date.today()-datetime.timdelta(1)).strftime('%Y-%m-%d')
        name_file = '*_{0}.txt'.format(date_nametrace)
        source = os.path.join("D:\\test\\source", name_file)
        dest = os.path.join("D:\\test\\source", x)
        list_trace = glob.glob(source)
        for i in list_trace:
            try:
                shutil.move(i, dest)
            except IOError:
                print("Erreur lors de la copie")
    Et pour le fichier log :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    a = open("log_trace", "w")
    for i in list_trace:
                    try:
                shutil.move(i, dest)
                a.write("Le fichier {0} à bien été copié \n".format(i))
            except IOError:
                print("Erreur lors de la copie")
                a.write("Le fichier {0} n\'a pas été copié".format(i))
    Par contre il créé le fichier dans le répertoire ou le programme se trouve, est il possible de lui spécifier ou le mettre ?

    Enfin, dans le fichier log je me tapes : D:\test\source\NOMFICHIER à bien été copié ..... Et oui, car j'ai utilisé glob et donc le chemin, mais je voudrais avoir uniquement le nom du fichier, any idea ? Pour sa que avant je me plaçait dans le dossier, sa m'évitait d'avoir le chemin.

    Par avance merci de votre aide

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 705
    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 705
    Par défaut copy daemon et test...
    Salut,

    Que dire? Tout d'abord bravo d'avoir le courage de poster vos premiers code au feu de la critique.

    Enfin, j'aimerais tester la copie des fichiers, savoir si le shutil.copy et .move ont bien fonctionné, auriez vous des indications sur comment procéder ?
    La question à se poser n'est pas tellement de détecter que çà "plante" plus ou moins proprement mais sortir un diagnostic qui permette de corriger qqc et ne pas oublier de recommencer.

    Dans un premier temps "sortir un diagnostic qui permette de corriger" peut se limiter à "çà à planté: pour le diagnostic débrouille toi avec le log"... Puis on pourra améliorer.

    "ne pas oublier de recommencer" c'est typiquement le script qui se re-soumet toutes les 2/4heures pour voir s'il y a du bouleau à faire - typiquement, quelqu'un à corrigé l'erreur genre purge du disque....

    Mais... il n'est peut être pas utile de recommencer la copie de tous les fichiers d'autant qu'ils ont peut être déjà tous été copiés sans erreur au premier coup.

    "été copiés sans erreur" : çà se complique. try-except c'est bon pour la première erreur, le hash md5 pourrait convenir mais c'est peut être un peu lourd de faire cela à chaque passage.

    Posons un fichier "source" a été copiés sans erreur si un nom de fichier identique existe dans le(s) répertoire(s) cible(s). Ce qui réduit les tests à faire...

    Comment faire çà?
    Soit fileName le nom de fichier dans le répertoire source. l'opération de copy s'effectue en 2 étapes:
    1. copy dans cible/tmp_fileName
    2. si la copy se termine, rename de cible/tmp_fileName en cible/fileName

    => Si la copy ne se termine pas proprement existera cible/tmp_fileName du fichier qui a planté... mais la condition "été copiés sans erreur" sera fausse.
    Le passage suivant pourra utiliser l'existence de "cible/tmp_fileName" pour essayer encore une fois ou râler plus fort...

    note: techniquement çà "fonctionne" parce rename est "atomique" dans tous les OS qui se respectent.

    - W
    PS: j'appelle cela le principe d'idempotence.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 705
    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 705
    Par défaut logging...
    Re...


    Egalement, j'aimerais ajouter un petit fichier log ou il écrit le résultat, qu'elle fichier on été copier etc ...
    Il n'y a rien à dire: juste vous indiquer que Python dispose de bibliothèque pour cela qui sont simples à mettre en œuvre et que pas mal de tutos existent.

    Lire les PyMOTW de Doug Hellman:
    logging
    exception handling techniques


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

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 822
    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 822
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par BUENOO Voir le message
    Par contre il créé le fichier dans le répertoire ou le programme se trouve, est il possible de lui spécifier ou le mettre ?
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    shutil.copy("dossier1/source", "dossier2/destination")

    Citation Envoyé par BUENOO Voir le message
    mais je voudrais avoir uniquement le nom du fichier, any idea ?
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import os
    os.path.basename("nom_complet")
    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]

Discussions similaires

  1. [MySQL] Optimisation de scripts PHP/MySQL
    Par DgG dans le forum PHP & Base de données
    Réponses: 368
    Dernier message: 20/11/2013, 18h59
  2. demande optimisation si possible
    Par android32 dans le forum HyperFileSQL
    Réponses: 3
    Dernier message: 04/01/2013, 14h54
  3. demande de conseil pour optimiser mon script
    Par seb.garcia dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 11/05/2011, 16h03
  4. script a optimiser
    Par croc14 dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 05/02/2009, 18h59
  5. script: demande d'aide
    Par imeys dans le forum Windows
    Réponses: 11
    Dernier message: 12/05/2006, 16h41

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