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

  1. #21
    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 tout le monde,

    Voici ou j'en suis avec mon script, je l'avais mis de côté le temps de continuer mon apprentissage, mais je vais me replonger dessus pour l'améliorer nottament en essayant de rajouter les classes.

    Je suis preneur de conseil, direction à prendre concernant l'amélioration de celui ci :

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
     
    # -*- coding: latin-1 -*
     
    import os, shutil, glob
    from datetime import date, timedelta
     
    ############################# Création des fonctions qui seront utilisé ############################# 
     
    def testpath(x, datetrace):
    	"""Fonction de test du chemin"""
     
    ### Récupération date  
    	today = date.today()	
     
    ### Définition des chemins ###
    	dest = os.path.join("\\\servdata1\\section MI\\TCM\\Traces", "N2", x, str(datetrace.year), str(datetrace.month), str(datetrace.day))
    	dest_partage = os.path.join("\\\infotrib1\\traceN2", x, str(datetrace.year), str(datetrace.month), str(datetrace.day))
     
    ### Ouverture log et message informatif ###
    	print('Bonjour, test de l\'existance de "', dest, '" en cours ...\n')
    	log = open("\\\servdata1\\section MI\\TCM\\Traces\\log_trace", "a")	
     
    ### Test existance chemin servdata et création si besoin ###
    	if os.path.exists(dest) == 0:
    		try:
    			os.makedirs(dest)
    			print('Création du chemin "', dest, '" car inexistant\n')
    			log.write('Fait le {0} : Création du chemin "{1}"\n'.format(today, dest))
    		except OSError:
    			print('Impossible de créer "', dest, '" demandé\n')
    			log.write('Fait le {0} : Problème lors de la création du chemin "{1}"\n'.format(today, dest))
    	else:
    		print('Le chemin "', dest, '" existe déjà\n')
    		log.write('Fait le {0} : Le chemin "{1}" existe déjà\n'.format(today, dest))
     
    ### Test existance chemin partage et création si besoin ###		
    	if os.path.exists(dest_partage) == 0:
    		try:
    			os.makedirs(dest_partage)
    			print('Création du chemin "', dest_partage, '" car inexistant\n\n\n')
    			log.write('Fait le {0} : Création du chemin "{1}"\n\n\n'.format(today, dest_partage))
    		except OSError:
    			print('Impossible de créer "', dest_partage, '" demandé\n\n\n')
    			log.write('Fait le {0} : Problème lors de la création du chemin "{1}"\n\n\n'.format(today, dest_partage))
    	else:
    		print('Le chemin "', dest_partage, '" existe déjà\n\n\n')
    		log.write('Fait le {0} : Le chemin "{1}" existe déjà\n\n\n'.format(today, dest_partage))
     
    ### Copie des traces ###
     
    def copietrace(x, datetrace):
     
    ### Récupération date  
    	today = date.today()
     
    	name_file = '*_%s.zip' % datetrace
    	source = os.path.join("\\\servdata1\\section MI\\TCM\\Traces", "N2", x, name_file)
    	dest = os.path.join("\\\servdata1\\section MI\\TCM\\Traces", "N2", x, str(datetrace.year), str(datetrace.month), str(datetrace.day))
    	dest_partage = os.path.join("\\\infotrib1\\traceN2", x, str(datetrace.year), str(datetrace.month), str(datetrace.day))
    	log = open("\\\servdata1\\section MI\\TCM\\Traces\\log_trace", "a")	
    	lfile = glob.glob(source)
    	for file in lfile:
    		try:
    			shutil.copy(file, dest)
    			shutil.move(file, dest_partage)
    			print('Copie en cours de ', file)
    			log.write('Copie de {0}\n'.format(today, file))
    		except IOError:
    			print('Copie impossible de ', file)
    			log.write('Copie impossible de {0}\n'.format(today, file))
     
    ################################ Fin fonction #####################################
     
     
     
    ######################## Corp du script ###############################
    print('========================\n= Transfert des traces =\n========================')
     
    choix = input('\nBonjour, bienvenue sur le script de transfert des traces. Merci de choisir une des deux options.\n\n1 = Transfert j-1\n2 = Transfert j-3\n')
     
    ### Choix du transfert à j-1 ou j-3 et récupération des dates ###
    i = 0 
    while i == 0:
    	if choix == "1":
    		datet = date.today()-timedelta(days=1)
    		print('\n\nRécupération des dates')
    		print('===================================')
    		print('= Voici la date j-1 : ', datet, "=")
    		print('===================================\n\n\n')
    		print('Test des chemins')
    		print('===================================')
    		testpath('n2c', datet)
    		testpath('n2m', datet)
    		print('===================================')
    		print('Transfert des traces')
    		print('===================================')
    		copietrace('n2c', datet)
    		copietrace('n2m', datet)
    		print('===================================')
    		i = 1
    	elif choix == "2":
    		datet = date.today()-timedelta(days=1)
    		datet2 = date.today()-timedelta(days=2)
    		datet3 = date.today()-timedelta(days=3)
    		print('\n\nRécupération des dates')
    		print('===================================')
    		print('= Voici la date j-1 : ', datet, "=")
    		print('= Voici la date j-2 : ', datet2, "=")
    		print('= Voici la date j-3 : ', datet3, "=")
    		print('===================================\n\n\n')
    		print('Test des chemins')
    		print('===================================')
    		testpath('n2c', datet)
    		testpath('n2c', datet2)
    		testpath('n2c', datet3)
    		testpath('n2m', datet)
    		testpath('n2m', datet2)
    		testpath('n2m', datet3)
    		print('===================================\n\n\n')
    		print('Transfert des traces')
    		print('===================================')
    		copietrace('n2c', datet)
    		copietrace('n2c', datet2)
    		copietrace('n2c', datet3)
    		copietrace('n2m', datet)
    		copietrace('n2m', datet2)
    		copietrace('n2m', datet3)
    		print('===================================')
    		i = 1
    	else:
    		print('Merci de choisir l\'option 1 ou 2')
    		choix = input('Bonjour, bienvenue sur le script de transfert des traces. Merci de choisir une des deux options.\n\n1 = Transfert j-1\n2 = Transfert j-3\n')
     
    testchem = input('\n\n\nL\'opération demandé est terminée. Un fichier log à été créé dans \\\servdata1\\section MI\\TCM\\Traces\\log_trace, ADP vous remercie de votre visite, à bientôt.')

  2. #22
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 760
    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 760
    Par défaut
    Salut,

    Si cela fonctionne, ce n'est pas si mal mais vu l'adhérence du script avec des arborescences particulières et difficiles à "dégager" pour jouer avec pas facile de répondre "avec du code".

    Reste quelques recommandations:

    - testtrace et copietrace font presque la même chose!
    Pourquoi ne pas factoriser la création des répertoires cibles et appeler la fonction correspondante depuis copietrace?
    - recopiez les fichiers vieux de N jours.
    Vous offrez la possibilité de recopier les traces de la veille ou de N jours suivants. Comme vous avez optez pour récupérer les fichiers qui correspondent à une date donnée via glob.glob(nom(date)), il faut itérer sur les "jours". Une autre possibilité serait de
    construire la date de départ via N
    pour chaque fichier de la forme '*_YYYY-MM-DD.zip' trouvés:
    extraire la date,
    si elle est supérieure à la date "départ"...
    recopier le fichier
    - rendre la chose testable hors contexte.
    Par exemple en définissant des variables gobales, genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SOURCE = r"\\servdata1\section MI\TCM\Traces"
    TARGET = r"\\servdata1\section MI\TCM\Traces"
    SHARE = r"\\infotrib1\traceN2"
    Vous voyez que les noms de serveurs nuisent à des tests "locaux", vous pourriez écrire:
    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
    HOST1, HOST2 = 'servdata1', 'infotrib1'
    TRACE = r"\section MI\TCM\Traces"
    TRCN2 = r"\traceN2"
     
    if HOST1 is None:
        SOURCE = '%(TRACE)s' % vars()
    else:
        SOURCE = r"\\%(HOST1)s%(TRACE)s" % vars()
    TARGET = SOURCE
     
    if HOST2 is None:
        SHARE = '%(TRCN2)s' % vars()
    else:
        SHARE = r'\\%(HOST2)s%(TRCN2)s' % vars()
    del TRACE, TRCN2
    note: le but est de permettre de tester, i.e. de garder le fonctionnel sans les arborescence.
    - utilisation des bibliothèques
    la construction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	dest = os.path.join(TARGET, "N2", x, str(datetrace.year), str(datetrace.month), str(datetrace.day))
    se termine "mal"...
    Plus concis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.path.join(SHARE, "N2", x,  *str(datetrace).split('-'))
    Last but not least: utilisez le module logging, il évite d'avoir à faire des print et des write dans un fichier.
    Bon d'accord, il est un peu effrayant mais comme il est "paramétrable" à volonté...
    L'important est définir une configuration "standard" qui pourra être modifiée plus tard, l'essentiel étant de l'utiliser (i.e. d'écrire le code qui ...).

    Personnellement, j'ai toujours un module/script 'logger.py' qui fait quelque chose comme:
    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
    from logging.config import dictConfig
     
    LOGGING = dict(
        version = 1,
        disable_existing_loggers = True,
        formatters = dict(
            simple = dict(
                format= '[%(levelname)s] %(message)s',
                ),
            precise = dict(
                format= '%(asctime)s [%(levelname)s] %(message)s',
                datefmt = '%Y-%m-%d %H:%M:%S',
             )
            ),
        handlers = dict(
            console = {
                'level' : 'DEBUG',
                'class' : 'logging.StreamHandler',
                'formatter' : 'simple',
                },
            file = {
                'level' : 'DEBUG',
                'class' : 'logging.FileHandler',
                'formatter' : 'precise',
                'filename' : 'example.log'
                },
            ),
        root = dict(
            handlers = ['console', 'file'],
            level = 'DEBUG',
            ),
     
        )
     
    def configure(path=None):
        if path:
            LOGGING['handlers']['file']['filename'] = path
        dictConfig(LOGGING)
    Puis dans le script principal, je commence par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if __name__ == '__main__':
        import as logger
        logger.configure()
    Puis dans tous les scripts qui ont besoin de "logging":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import logging
    log = logging.getLogger()
    logging étant "singleton", çà fonctionne très bien...

    çà fait du boulot...
    Bon courage

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

  3. #23
    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 Wiztricks,

    Tout d'abord merci énormément pour le temps accordé et ces pistes d'améliorations ! J'ai commencé un peu à creser tout sa

    - testtrace et copietrace font presque la même chose!
    Pourquoi ne pas factoriser la création des répertoires cibles et appeler la fonction correspondante depuis copietrace?
    Je n'es pas de testtrace mais bien un testpath, enfête une vérifie que les dossiers sont bien présent ou non et les créés si besoin et l'autre fait uniquement la copie des fichiers. Si j'ai bien compris, il faudrais que j'appel ma fonction de test des chemins dans ma fonction de copie de trace ?

    - recopiez les fichiers vieux de N jours.
    Vous offrez la possibilité de recopier les traces de la veille ou de N jours suivants. Comme vous avez optez pour récupérer les fichiers qui correspondent à une date donnée via glob.glob(nom(date)), il faut itérer sur les "jours". Une autre possibilité serait de
    construire la date de départ via N
    pour chaque fichier de la forme '*_YYYY-MM-DD.zip' trouvés:
    extraire la date,
    si elle est supérieure à la date "départ"...
    recopier le fichier
    Très bonne idée en effet ... mais je sens que pour sa je vais galérer pas mal, avec vérification etc ... je vais laisser sa de côté pour le moment ^^ Surtout qu'il n'y a que le Lundi (vue qu'il y a eu le week end) que l'on doit récupérer les traces sur les 3j. Eventuellement se tourner plus : Si on est lundi, alors récupère à j-3 ?

    - rendre la chose testable hors contexte.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SOURCE = r"\\servdata1\section MI\TCM\Traces"
    Franchement merci, sa me rendais fou, ce que tu me montres là est très utile, sa va vraiment m'aider. En revanche je ne comprend pas tout ...
    Le petit r devant le chemin ?? Celà la rend global ? Je pourrais la déclarer hors de ma fonction et l'utiliser ?

    Après tu tests si les serveurs sont attaquable, positif on prend le chemin avec sinon il passe en local ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SOURCE = '%(TRACE)s' % vars()
    Ici ce code équivaut à : SOURCE = '%s' % TRACE ?? Y'a t'il un avantage à utilisé ta méthode ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    os.path.join(SHARE, "N2", x,  *str(datetrace).split('-'))
    Beaucoup plus propre en effet En revanche petite question, j'ai essayé sans * pour voir et sa renvoi un message d'erreur. Que permet * exactement stp ?

    Concernant le module logging, on m'en avait déjà parlé mais après mettre renseigné dessus, je l'avais mis de côté car comme tu le dis il demande une certaine conf et du temps pour le comprendre. Je vais donc le garder également pour la fin le temps de faire le reste avant

    Enfin, j'ai également regardé un peu les List Comprehension, penses tu que je puisses les utilisés dans mon logiciel ? Je ne suis pas encore très calé dessus, mais sa me permettrais de m'entrainer un peu.

    Je te remercie pour tout et continuer l'amélioration de mon script Je reviendrais vers vous après ,)

    Bonne journée,
    BUENOO.

  4. #24
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 760
    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 760
    Par défaut
    Salut,

    Si j'ai bien compris, il faudrais que j'appel ma fonction de test des chemins dans ma fonction de copie de trace ?
    yup: l'idée est de factoriser le code pour appeler une fonction qui crée le répertoire s'il n'existe pas. Ce qu'on factorise c'est le calcul des répertoires destination.
    Beaucoup plus propre en effet En revanche petite question, j'ai essayé sans * pour voir et sa renvoi un message d'erreur. Que permet * exactement stp
    str(datetrace).split('-') retourne une liste. Ce qu'on veut c'est passer la suite de ses éléments comme paramètres à os.path.join, c'est ce que fait "*".

    Concernant le module logging, on m'en avait déjà parlé mais après mettre renseigné dessus, je l'avais mis de côté car comme tu le dis il demande une certaine conf et du temps pour le comprendre. Je vais donc le garder également pour la fin le temps de faire le reste avant
    Le jour ou le code sera en production vous aurez envie de passer à autre chose! Je vous ai donné la bibliothèque qui permet de configurer le module logging, il vous suffit de l'utiliser.

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

  5. #25
    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
    Le jour ou le code sera en production vous aurez envie de passer à autre chose! Je vous ai donné la bibliothèque qui permet de configurer le module logging, il vous suffit de l'utiliser.
    Enfête je listes tout ce que je souhaites faire pour l'améliorer, dans un ordre que je suis dans l'implémentation.

    Sinon j'ai d'autres questions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SOURCE = r"\\servdata1\section MI\TCM\Traces"
    Le petit "r" devant le chemin permet de la rendre global c'est sa ? Concrètement, je peux déclarer sa en dehors de mes fonctions, et les utiliser dans mes fonctions tout de même ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SOURCE = '%(TRACE)s' % vars()
    Sa reviens ici au même que : SOURCE = '%s' % TRACE
    Y'a t'il un avantage à utilisé l'une ou l'autre façon d'écrire celà ? Ou c'est juste une question d'habitude ? Je vois un avantage à première vue si il y'a beaucoup de variable, on voit directement qu'elle variable sera à tel endroit, mais sinon ?

    Enfin sur ce code :
    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
    HOST1, HOST2 = 'servdata1', 'infotrib1'
    TRACE = r"\section MI\TCM\Traces"
    TRCN2 = r"\traceN2"
     
    if HOST1 is None:
        SOURCE = '%(TRACE)s' % vars()
    else:
        SOURCE = r"\\%(HOST1)s%(TRACE)s" % vars()
    TARGET = SOURCE
     
    if HOST2 is None:
        SHARE = '%(TRCN2)s' % vars()
    else:
        SHARE = r'\\%(HOST2)s%(TRCN2)s' % vars()
    del TRACE, TRCN2
    La le résultat du if sera toujours != None vue que je définis HOST1 et HOST2 ... Faudrais rajouter un test du chemin plutôt non ?

    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
    HOST1, HOST2 = 'servdata1', 'infotrib1'
    TRACE = r"\section MI\TCM\Traces"
    TRCN2 = r"\traceN2"
     
    if os.path.exists(SOURCE) is False:
        SOURCE = '%(TRACE)s' % vars()
    else:
        SOURCE = r"\\%(HOST1)s%(TRACE)s" % vars()
    TARGET = SOURCE
     
    if os.path.exists(SHARE) is False:
        SHARE = '%(TRCN2)s' % vars()
    else:
        SHARE = r'\\%(HOST2)s%(TRCN2)s' % vars()
    del TRACE, TRCN2
    Sa me permettrais même d'implémenter sa dans le script pour tester qu'elle serveur est up, car là on sur le membre 1 mais en cas de problème il est possible que celà bascule sur les membres 2.

    BUENOO.

    EDIT :

    Voilà ou j'en suis pour ma fonction qui vérifie qu'elle serveur est up, créé le chemin adéquate (meme local si les liens réseaux ne marche pas, plus pour mes tests ici ) et créé le chemin réseaux si celui ci n'existe pas.

    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
    65
    66
    # -*- coding: latin-1 -*
     
    from datetime import date, timedelta
    import os
     
    def ServPathMake(x):
        "Vérification du serveur en production"
     
        # Définition des hosts #
        INF1, INF2, SERVD1, SERVD2 = "infotrib1", "infotrib2", "servdata1", "servdata2"
     
        # Définition des chemins dur #
        TRACE = "\section MI\TCM\Traces\\N2"    #j'ai pu mettre le N2 grace au \\
        TRACEN2 = os.path.join("traceN2") #Ici obligé d'utiliser os.path.join pour faire fonctionner les test en local, il aimait pas le \t qu'il m'enlevais. Le double \\ permettais d'utiliser en local mais pas en réseaux, cette option règle tout les problèmes :)
     
        # Récupération date à j-1 #
        datet = date.today()-timedelta(days=1)
        print("Voici la date à j-1 %(datet)s" % vars())
     
        # Vérification du serveur up source, création du chemin si inexistant#
        SOURCE = '\\%(SERVD1)s%(TRACE)s' % vars()
        if os.path.exists(SOURCE) is False:
            print("Connection impossible à servdata1")
            SOURCE = '\\%(SERVD2)s%(TRACE)s' % vars()
            if os.path.exists(SOURCE) is False:
                print("Connection impossible à servdata2")
                print("Mise en place des chemins en local")
                SOURCE = '%(TRACE)s' % vars()
            else:
                print("Connection à réussi servdata2.")
        else:
            print("Connection réussi à servdata1")
     
        # Définition du chemin de sauvegarde #
        DEST = os.path.join(SOURCE, x, *str(datet).split("-"))
     
        # Création du chemin si non existant #
        if os.path.exists(DEST) == 0:
            print("Le chemin n'existe pas, celui ci va être créé")
            os.makedirs(DEST)
        else:
            print("Le chemin existe déjà")
     
        # Vérification du serveur up partage, création du chemin si inexistant#    
        SHARE = '\\%(INF1)s%(TRACEN2)s' % vars()
        if os.path.exists(SHARE) is False:
            print("Connection impossible à infotrib1")
            SHARE = '\\%(INF2)s%(TRACEN2)s' % vars()
            if os.path.exists(SHARE) is False:
                print("Connection impossible à infotrib2")
                print("Mise en place des chemins en local")
                SHARE = '%(TRACEN2)s' % vars()
            else:
                print("Connection réussi à infotrib2")
        else:
            print("Connection réussi à infotrib1")
     
        # Définition du chemin de partage #
        DESTB = os.path.join(SHARE, x, *str(datet).split("-"))
     
        # Création du chemin si non existant #
        if os.path.exists(DESTB) == 0:
            print("Le chemin n'existe pas, celui ci va être crée")
            os.makedirs(DESTB)
        else:
            print("Le chemin existe déjà")

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

    Le petit "r" devant le chemin permet de la rendre global c'est sa ?
    Il sert juste à dire de ne pas interpréter les '\' comme caractère d'échappement (et donc de ne pas avoir à les doubler).
    Sa reviens ici au même que : SOURCE = '%s' % TRACE
    Y'a t'il un avantage à utilisé l'une ou l'autre façon d'écrire celà ? Ou c'est juste une question d'habitude ? Je vois un avantage à première vue si il y'a beaucoup de variable, on voit directement qu'elle variable sera à tel endroit, mais sinon ?
    Peu ou beaucoup, çà aide mes yeux donc c'est bien.

    La le résultat du if sera toujours != None vue que je définis HOST1 et HOST2 ... Faudrais rajouter un test du chemin plutôt non ?
    Ben pour tester le script on peut très bien le faire sur des arborescences locales sans HOST1, HOST2....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        # Définition des hosts #
        INF1, INF2, SERVD1, SERVD2 = "infotrib1", "infotrib2", "servdata1", "servdata2"
    remarque non Python.
    inf1, inf2 sont des serveurs qui permettent d'accéder à un "service".
    Si çà bascule, c'est que le service est actif/passif.
    Il serait donc sage, recommandable d'avoir un nom INF associée à une adresse IP autre que INF1, INF2 qui soit dynamiquement déclarée par le serveur "actif". C'est une fonctionnalité de "base" d'un cluster microsoft.
    => inutile de faire dans son code le boulot du DNS, du cluster bricolé ou du load balancer qu'on mettra peut être un jour.

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

  7. #27
    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
    Bien vue, j'étais pas sur que je pouvais utiliser les alias mais si c'est possible je vais le faire, mais bon sa m'a permis d'écrire un peu de code supplémentaire :p

    Sinon voici la fonction de test et création des chemins, qui intègre la création à j-3.

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    # -*- coding: latin-1 -*
     
    '''
    Created on 15 févr. 2012
     
    @author: BUENOO
    '''
     
    from datetime import date, timedelta
    import os
     
    def testpath(x, datet):
        "Vérification et création des chemins"
     
        # Définition des hosts #
        HOST1, HOST2 = "Clusinfotrib", "servdata1"
     
        # Définition des chemins dur #
        TRACE = r"\section MI\TCM\Traces\N2"
        TRACEN2 = r"\traceN2"
     
        # Récupération date j-2 et j-3
        datet2 = datet-timedelta(days=1)
        datet3 = datet2-timedelta(days=1)
     
        # Vérification du serveur up source, création du chemin si inexistant#
        SOURCE = r'\\%(HOST2)s%(TRACE)s' % vars()
        if os.path.exists(SOURCE) is False:
            print("Connection impossible à servdata1")
            print("Mise en place des chemins locaux")
            SOURCE = '%(TRACE)s' % vars()
        else:
            print("Connection réussi à servdata1")
     
        # Définition du chemin de sauvegarde #
        DEST = os.path.join(SOURCE, x, *str(datet).split("-"))
        DEST2 = os.path.join(SOURCE, x, *str(datet2).split("-"))
        DEST3 = os.path.join(SOURCE, x, *str(datet3).split("-"))
     
        # Création du chemin si non existant #
        if os.path.exists(DEST) == 0:
            print("Le chemin n'existe pas, celui ci va être créé")
            os.makedirs(DEST)
            if os.path.exists(DEST2) == 0:
                print("Création du chemin à j-2")
                os.makedirs(DEST2)
                if os.path.exists(DEST3) == 0:
                    print("Création du chemin à j-3")
                    os.makedirs(DEST3)
        else:
            print("Le chemin existe déjà")
     
        # Vérification du serveur up partage, création du chemin si inexistant#    
        SHARE = r'\\%(HOST1)s%(TRACEN2)s' % vars()
        if os.path.exists(SHARE) is False:
            print("Connection impossible à Clusinfotrib")
            print("Mise en place des chemins locaux")
            SHARE = '%(TRACEN2)s' % vars()
        else:
            print("Connection réussi au serveur de partage")
     
        # Définition du chemin de partage #
        DESTB = os.path.join(SHARE, x, *str(datet).split("-"))
        DESTB2 = os.path.join(SHARE, x, *str(datet2).split("-"))
        DESTB3 = os.path.join(SHARE, x, *str(datet3).split("-"))
     
        # Création du chemin si non existant #
        if os.path.exists(DESTB) == 0:
            print("Le chemin n'existe pas, celui ci va être crée")
            os.makedirs(DESTB)
            if os.path.exists(DESTB2) == 0:
                print("Création du chemin à j-2")
                os.makedirs(DESTB2)
                if os.path.exists(DESTB3) == 0:
                    print("Création du chemin à j-3")
                    os.makedirs(DESTB3)
        else:
            print("Le chemin existe déjà")
     
    datet = date.today()-timedelta(days=1)       
    testpath('n2c', datet)
    testpath('n2m', datet)
    Par contre pour la fonction de copie j'ai une petite question ... En effet je vais avoir besoin des variables SOURCE, DEST et DESTB, est il possible d'utiliser celles présentes dans ma fonction testpath ? C'est à dire que dans mon fonction copitrace, j'appel la fonction testpath qui me définit/créé les chemins et me renvoi également les chemins pour que je les utilises dans ma fonction de copie.
    J'ai pensé à utiliser les Classes pour faire sa ...

  8. #28
    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 !

    Depuis quelques jours je travailles sur les classes, commençant à comprendre un peux mieux ce que c'était j'ai décidé de les utilisés pour un script. Il fonctionne bien mais débutant dans les classes, l'avis de connaisseurs serait le bien venu

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    # -*- coding: latin-1 -*
     
    '''
    Created on 22 févr. 2012
     
    @author: BUENOO
    '''
     
    from datetime import date, timedelta
    import os, fnmatch, shutil
     
    class TransfertN3:
        """Classe pour le transfert des traces N3. Création des chemins nécessaire et transfert des traces, de j-1 à j-3"""
     
        def __init__(self):
            "Fonction d'initialisation de la classe"
            self.host = 'servdata1'
            self.trace = r'\section MI\TCM\Traces\N3'
            self.src = r'\\{0}{1}'.format(self.host, self.trace)
     
        def datetrace(self):
            "Fonction qui récupère les dates"
            self.t = date.today()-timedelta(days=1)
            self.t2 = self.t-timedelta(days=1)
            self.t3 = self.t2-timedelta(days=1)
     
        def nameFile(self):
            "Fonction qui définit les noms des fichiers à récupérer"
            self.nameFile = '*_{0}.zip'.format(self.t)
            self.nameFile2 = '*_{0}.zip'.format(self.t2)
            self.nameFile3 = '*_{0}.zip'.format(self.t3)
     
        def pathDest(self):
            "Fonction qui définit les chemins de destination et les crées si besoin"
            self.dest = os.path.join(self.src, *str(self.t).split("-"))
            self.dest2 = os.path.join(self.src, *str(self.t2).split("-"))
            self.dest3 = os.path.join(self.src, *str(self.t3).split("-"))
            if os.path.exists(self.dest) == 0:
                print("Le chemin n'existe pas, celui ci va être créé")
                os.makedirs(self.dest)
                if os.path.exists(self.dest2) == 0:
                    print("Création du chemin à j-2")
                    os.makedirs(self.dest2)
                    if os.path.exists(self.dest3) == 0:
                        print("Création du chemin à j-3")
                        os.makedirs(self.dest3)
            else:
                print("Le chemin existe déjà")
     
        def copieTrace(self):
            "Fonction qui copie les traces de la source vers la destination"
            self.lfile = os.listdir(self.src)
    	count = 0
            for file in range(len(self.lfile)):            
                if fnmatch.fnmatch(self.lfile[file], self.nameFile):
                    try:
                        filet = os.path.join(self.src, self.lfile[file])
                        print('Copie en cours de ', self.lfile[file])
                        shutil.move(filet, self.dest)
    		    count = 1
                    except:
                        print('Copie de ', self.lfile[file], ' impossible')        
                if fnmatch.fnmatch(self.lfile[file], self.nameFile2):
                    try:
                        filet2 = os.path.join(self.src, self.lfile[file])
                        print('Copie en cours de ', self.lfile[file])
                        shutil.move(filet2, self.dest2)
    		    count = 1
                    except:
                        print('Copie de ', self.lfile[file], ' impossible')            
                if fnmatch.fnmatch(self.lfile[file], self.nameFile3):
                    try:
                        filet3 = os.path.join(self.src, self.lfile[file])
                        print('Copie en cours de ', self.lfile[file])
                        shutil.move(filet3, self.dest3)
    		    count = 1
                    except:
                        print('Copie de ', self.lfile[file], ' impossible') 
    	if count == 0:
    		print("Aucune trace n'est présente")                       
     
        def showpath(self):
            print('Host :', self.host, 'Trace :', self.trace, 'Source :', self.src)
            print('Date j-1 :', self.t, 'Date j-2 :', self.t2, 'Date j-3 :', self.t3)
            print('NameFile1 :', self.nameFile, 'NameFile2 :', self.nameFile2, 'NameFile3 :', self.nameFile3)
            print('Dest1 :', self.dest, 'Dest2 :', self.dest2, 'Dest3 :', self.dest3)
     
    x = TransfertN3()
    x.datetrace()
    x.nameFile()
    x.pathDest()
    x.copieTrace()
     
    y = input('Le transfert des traces N3 est terminé, appuyez sur une touche pour quitter.')

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

    Depuis quelques jours je travailles sur les classes, commençant à comprendre un peux mieux ce que c'était j'ai décidé de les utilisés pour un script. Il fonctionne bien mais débutant dans les classes, l'avis de connaisseurs serait le bien venu

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    # -*- coding: latin-1 -*
     
    '''
    Created on 22 févr. 2012
     
    @author: BUENOO
    '''
     
    from datetime import date, timedelta
    import os, fnmatch, shutil
     
    class TransfertN3:
        """Classe pour le transfert des traces N3. Création des chemins nécessaire et transfert des traces, de j-1 à j-3"""
     
        def __init__(self):
            "Fonction d'initialisation de la classe"
            self.host = 'servdata1'
            self.trace = r'\section MI\TCM\Traces\N3'
            self.src = r'\\{0}{1}'.format(self.host, self.trace)
     
        def datetrace(self):
            "Fonction qui récupère les dates"
            self.t = date.today()-timedelta(days=1)
            self.t2 = self.t-timedelta(days=1)
            self.t3 = self.t2-timedelta(days=1)
     
        def nameFile(self):
            "Fonction qui définit les noms des fichiers à récupérer"
            self.nameFile = '*_{0}.zip'.format(self.t)
            self.nameFile2 = '*_{0}.zip'.format(self.t2)
            self.nameFile3 = '*_{0}.zip'.format(self.t3)
     
        def pathDest(self):
            "Fonction qui définit les chemins de destination et les crées si besoin"
            self.dest = os.path.join(self.src, *str(self.t).split("-"))
            self.dest2 = os.path.join(self.src, *str(self.t2).split("-"))
            self.dest3 = os.path.join(self.src, *str(self.t3).split("-"))
            if os.path.exists(self.dest) == 0:
                print("Le chemin n'existe pas, celui ci va être créé")
                os.makedirs(self.dest)
                if os.path.exists(self.dest2) == 0:
                    print("Création du chemin à j-2")
                    os.makedirs(self.dest2)
                    if os.path.exists(self.dest3) == 0:
                        print("Création du chemin à j-3")
                        os.makedirs(self.dest3)
            else:
                print("Le chemin existe déjà")
     
        def copieTrace(self):
            "Fonction qui copie les traces de la source vers la destination"
            self.lfile = os.listdir(self.src)
    	count = 0
            for file in range(len(self.lfile)):            
                if fnmatch.fnmatch(self.lfile[file], self.nameFile):
                    try:
                        filet = os.path.join(self.src, self.lfile[file])
                        print('Copie en cours de ', self.lfile[file])
                        shutil.move(filet, self.dest)
    		    count = 1
                    except:
                        print('Copie de ', self.lfile[file], ' impossible')        
                if fnmatch.fnmatch(self.lfile[file], self.nameFile2):
                    try:
                        filet2 = os.path.join(self.src, self.lfile[file])
                        print('Copie en cours de ', self.lfile[file])
                        shutil.move(filet2, self.dest2)
    		    count = 1
                    except:
                        print('Copie de ', self.lfile[file], ' impossible')            
                if fnmatch.fnmatch(self.lfile[file], self.nameFile3):
                    try:
                        filet3 = os.path.join(self.src, self.lfile[file])
                        print('Copie en cours de ', self.lfile[file])
                        shutil.move(filet3, self.dest3)
    		    count = 1
                    except:
                        print('Copie de ', self.lfile[file], ' impossible') 
    	if count == 0:
    		print("Aucune trace n'est présente")                       
     
        def showpath(self):
            print('Host :', self.host, 'Trace :', self.trace, 'Source :', self.src)
            print('Date j-1 :', self.t, 'Date j-2 :', self.t2, 'Date j-3 :', self.t3)
            print('NameFile1 :', self.nameFile, 'NameFile2 :', self.nameFile2, 'NameFile3 :', self.nameFile3)
            print('Dest1 :', self.dest, 'Dest2 :', self.dest2, 'Dest3 :', self.dest3)
     
    x = TransfertN3()
    x.datetrace()
    x.nameFile()
    x.pathDest()
    x.copieTrace()
     
    y = input('Le transfert des traces N3 est terminé, appuyez sur une touche pour quitter.')
    Salut

    C'est pas mal. Tu commences à bien te débrouiller.
    Eventuellement les méthodes datetrace() et namefile() peuvent être supprimées et le code correspondant transféré dans le __init__() (en fait ça dépend surtout si tu as besoin de les appeler plusieurs fois pour ton objet)

    Maintenant il existe certaines duplication de code qui auraient tout avantage à passer dans un tableau. Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def datetrace(self):
    	"Fonction qui récupère les dates"
    	delta=timedelta(days=1)
    	self.t=[]
    	for i in xrange(3):
    		self.t.append((self.t[-1] if i != 0 else date.today()) - delta)
     
    def nameFile(self):
    	"Fonction qui définit les noms des fichiers à récupérer"
    	self.nameFile = ['*_{0}.zip'.format(x) for x in self.t]

    Ensuite, au lieu d'utiliser self.t1 ou self.namefile1 ben tu utilises self.t[1] et self.namefile[1]
    L'avantage, c'est que tu peux utiliser les boucles pour simplifier certaines parties répétées. Et si tu as besoin demain d'avoir un 4° élément ben tu remplaces xrange(3) par xrange(4) et c'est tout...
    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]

  10. #30
    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
    Coucou

    Merci pour les infos Sve@r, très très utile, j'avais un peu de mal à appliquer l'utilisation des tableaux ... En revanche juste pour info, j'utilises la version 3x de python et apparament xrange() n'existe plus, il faut utiliser range() now.

    Puis pour remplacer self.t (j-1) j'utilise maintenant self.t[0] et non self.t[1] (qui est la deuxieme entré de ma liste, soit la date à j-2) ^^ Tu as voulu m'induire en erreur !

    Du coup je penses pouvoir utiliser le même concept pour le calcul des chemins de destinaton non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    self.dest = os.path.join(self.src, *str(self.t).split("-"))
            self.dest2 = os.path.join(self.src, *str(self.t2).split("-"))
            self.dest3 = os.path.join(self.src, *str(self.t3).split("-"))
    EDIT : Ce fut compliqué mais j'ai finalement réussi ! Mais j'ai une question existantielle. En effet j'ai deux manière de le faire, je ne sais pas dans un soucis d'optimisation (nottament vitesse d'execution) si l'une est mieux que l'autre ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dest = []
    for x in self.t:
        dest.append(os.path.join(self.src, *str(x).split("-")))
    OU
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dest = []
    for x in range(len(self.t)):
        dest.append(os.path.join(self.src, *str(t[x]).split("-")))
    Encore merci

  11. #31
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 103
    Par défaut
    Des 2, il est préférable d'utiliser le format ci-dessous.
    Si yen a un plus perfomant ça doit être celui-là de peu.
    Mais c'est surtout beaucoup plus lisible.
    Citation Envoyé par BUENOO Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dest = []
    for x in self.t:
        dest.append(os.path.join(self.src, *str(x).split("-")))

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

    Merci pour les infos Sve@r, très très utile, j'avais un peu de mal à appliquer l'utilisation des tableaux ... En revanche juste pour info, j'utilises la version 3x de python et apparament xrange() n'existe plus, il faut utiliser range() now.
    range() existe aussi en v2 mais on lui préfère xrange() qui crée un générateur alors que range() crée le tableau entier en mémoire. Bizarre qu'il ait disparu en v3...

    Citation Envoyé par BUENOO Voir le message
    EDIT : Ce fut compliqué mais j'ai finalement réussi ! Mais j'ai une question existantielle. En effet j'ai deux manière de le faire, je ne sais pas dans un soucis d'optimisation (nottament vitesse d'execution) si l'une est mieux que l'autre ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dest = []
    for x in self.t:
        dest.append(os.path.join(self.src, *str(x).split("-")))
    OU
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dest = []
    for x in range(len(self.t)):
        dest.append(os.path.join(self.src, *str(t[x]).split("-")))
    D'instinct je pense que la seconde est plus lente. Déjà tu appelles range(len(x)) alors que dans la première tu pars directement sur les éléments de t. Et ensuite tu demandes t[x] ce qui induit une indirection (je parle par rapport au C mais derrière Python il y a du C) que tu n'as pas dans la première.

    Sinon dest=[os.path.join(self.src, *str(x).split("-")) for x in self.t]
    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]

  13. #33
    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
    Merci beaucoup pour vos interventions, j'ai pu améliorer certains points qui me font gagner pas mal de lignes de code au final et surtout beaucoup plus propre et simple à modifier

    Pour la date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def datetrace(self):
        delta = timedelta(days=1)
        self.t = []
        [self.t.append((self.t[-1] if i != 0 else date.today()) - delta) for i in range(3)]
    Pour le chemin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def pathDest(self):
        self.dest = []
        self.dest = [os.path.join(self.src, *str(x).split("-")) for x in self.t]
        [os.makedirs(x) if os.path.exists(x) is False else print('Le chemin', x, 'existe déjà') for x in dest]
    Ici je gagne énormément de lignes
    Pour la dernière je vais peut être utilisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [print('Le chemin', x, 'existe déjà') if os.path.exists(x) != 0 else os.makedirs(x) for x in dest]
    BUENOO

  14. #34
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 065
    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 065
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def datetrace(self):
        delta = timedelta(days=1)
        self.t = []
        [self.t.append((self.t[-1] if i != 0 else date.today()) - delta) for i in range(3)]
    ça m'étonnerait que tes codes fonctionnent.

    Edit : Au fait c'est quoi l'intérêt de datetrace() ?

  15. #35
    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
    Je travail sur mon PC portable au boulot qui n'a pas le net (qui est sur un autre PC) du coup j'ai recopié manuellement. Mais sinon j'ai fait les tests avec l'interpréteur et sa fonctionnait parfaitement, il me mettait bien mes dates dans ma liste.
    Je pourrais te confirmer sa demain car j'ai laissé mon portable là bas ...

    Ma fonction datetrace me permet de récupérer trois dates, de j-1 à j-3. Ce qui me permet de :
    - Définir les noms de mes fichiers à prendre ( *_date.zip) de j-1 à j-3
    - Également dans le check/création des chemins de type : HOST\*\AAAA\MM\JJ

  16. #36
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 065
    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 065
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> def datetrace(obj_date, jour):
    ...     return [obj_date-timedelta(days=i) for i in range(jour+1) if i != 0]
    jour est le nombre de jours que tu souhaites avoir en dessous de la date d'aujourd'hui, exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> datetrace(date.today(), 3)
    [datetime.date(2012, 2, 27), datetime.date(2012, 2, 26), datetime.date(2012, 2, 25)]
    du coup on arrive simplement à la création de tes fichiers zip

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> dates = datetrace(date.today(), 3)
    >>> for i in dates:
    ...     print "{0}{1}{2}_date.zip".format(i.day, i.month, i.year)
    ... 
    2722012_date.zip
    2622012_date.zip
    2522012_date.zip
    J'espère avoir pu t'aider

    PS : t'avais oublié les return dans tes fonctions

  17. #37
    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
    Coucou,

    Alors je reviens de faire mes tests sous interpréteur donc sans les fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import os
    from datetime import date, timedelta
     
    delta = timedelta(days=1)
    t = []
    [t.append((t[-1] if i != 0 else date.today()) - delta) for i in range(3)]
    -> t : [datetime.date(2012, 2, 28), datetime.date(2012, 2, 27), datetime.date(2012, 2, 26)]
    dest = []
    src = r'\\servtest\test'
    dest = [os.path.join(src, *str(x).split("-")) for x in t]
    Le retour de dest me donne bien mes trois chemins.

    Concernant ce que tu m'as donné, c'est pas mal car j'aurais juste à changé l'appel de la fonction si je veux a j-4, mais normalement le max est de j-3. Puis le nom des fichiers pour êtres exact est : *_29-02-2012.zip
    Donc je penses que les deux reviennent plus ou moins au même pour moi sur CE script

    Par contre je sais pas si sa jou, mais je suis sur python 3.X

  18. #38
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 065
    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 065
    Par défaut
    Alors je reviens de faire mes tests sous interpréteur donc sans les fonctions :
    Ce n'est pas sur l'interpréteur qu'il faut faire le test cette fois-ci

    Mais ta fonction fonctionne très bien, je propose juste une autre solution.

    Là où tu avais un problème, c'est qu'il te manque le return dans tes fonctions, c'est gênant, ça devrait rien retourner.

    Concernant ce que tu m'as donné, c'est pas mal car j'aurais juste à changé l'appel de la fonction si je veux a j-4, mais normalement le max est de j-3
    C'est le but

    Puis le nom des fichiers pour êtres exact est : *_29-02-2012.zip
    Pas de gros changements en effet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print("_{0}-{1}-{2}.zip".format(i.day, i.month, i.year))
    Par contre je sais pas si sa jou, mais je suis sur python 3.X
    Juste pour le print qui sera une fonction, dont j'ai fais la modif sur la ligne de code ci-dessus.

  19. #39
    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
    Je dois t'avouer que le return, je ne le comprend actuellement pas trop, faudrais que je retournes bouquinner là où il (Gerard Swinnen) en parle. Car sans, mes fonctions marchent niquel, j'ai testé les scripts et rien à signaler, sa tourne bien ...

    La je vais essayer de voir si je peux pas raccourcir ma fonction copieTrace() ... Mais j'ai testé ce matin et j'ai du mal car sa dépend de pas mal de listes ...

    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
        def copieTrace(self):
            "Fonction qui copie les traces de la source vers la destination"
            self.lfile = os.listdir(self.src)
            count = 0
            for file in range(len(self.lfile)):
                filet = os.path.join(self.src, self.lfile[file])            
                if fnmatch.fnmatch(self.lfile[file], self.nameFile[0]):
                    try:
                        print('Copie en cours de ', self.lfile[file])
                        shutil.move(filet, self.dest[0])
                        count = 1
                    except:
                        print('Copie de ', self.lfile[file], ' impossible')               
                if fnmatch.fnmatch(self.lfile[file], self.nameFile[1]):
                    try:
                        print('Copie en cours de ', self.lfile[file])
                        shutil.move(filet, self.dest[1])
                        count = 1
                    except:
                        print('Copie de ', self.lfile[file], ' impossible')            
                if fnmatch.fnmatch(self.lfile[file], self.nameFile[2]):
                    try:
                        print('Copie en cours de ', self.lfile[file])
                        shutil.move(filet, self.dest[2])
                        count = 1
                    except:
                        print('Copie de ', self.lfile[file], ' impossible')
            if count == 0:
                print("Aucune trace n'est présente")

  20. #40
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 065
    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 065
    Par défaut
    Je dois t'avouer que le return, je ne le comprend actuellement pas trop, faudrais que je retournes bouquinner là où il (Gerard Swinnen) en parle. Car sans, mes fonctions marchent niquel, j'ai testé les scripts et rien à signaler, sa tourne bien ...
    Un code ne se fait pas dans un interpréteur (seulement des bouts de code pour tests).

    Tu dois mettre tout cela dans un fichier et l'exécuter.

    Si tu l'exécutes dans un fichier tes return manquent, sinon à l'interpréteur il exécutera intuitivement ton bout de code.

    La je vais essayer de voir si je peux pas raccourcir ma fonction copieTrace() ... Mais j'ai testé ce matin et j'ai du mal car sa dépend de pas mal de listes ...
    Bah ton code est incomplet, c'est quoi l'intérêt de cette fonction?

    Pourquoi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for file in range(len(self.lfile)):
    Plutôt que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for file in self.lfile:
    C'est un exemple, j'ai regardé en diagonale.

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