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. #1
    Nouveau membre du Club
    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
    Points : 27
    Points
    27
    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
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    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 éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 : 3 823
    Points : 7 119
    Points
    7 119
    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
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  4. #4
    Nouveau membre du Club
    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
    Points : 27
    Points
    27
    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 sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    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 sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    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
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Re

    Je voudrais donc avoir vos avis sur ce code ? Y'a t'il des portions améliorable ? Des techniques plus pratique que celle employé ?
    Le nommage de vos répertoires cibles est "tuant":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dest_n2c *******\N2\N2C\2011\2011-12\06-12-2011
    dest_n2c_partage *****\N2\2011-12\06-12-2011
    Pourquoi construire un répertoire par année, puis par mois puis par jour surtout en ne gardant pas le rangement naturel de la date yyyy-mm-dd?
    Vous pourriez ne créer qu'un répertoire cible 2011-12-06 et y ranger les fichiers de la veille dedans...
    Cette plaisanterie vous coûte les initialisations de variables initiales:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    date_nametrace
    today_year 
    today_yearmonth
    today_daymonthyear
    avec des noms trompeur "today" pour la date d'hier, il faut oser quand même.
    Plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    from datetime import date, timedelta 
    yesterday = date.today() - timedelta(days=1)
    print yesterday.year, yesterday.month, yesterday.day
    => les informations year, month, day sont déjà accessible dans "date", pas besoin de se torturer pour les récupérer!
    de plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> print yesterday
    2011-12-06
    C'est déjà bien rangé...

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

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    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]

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    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
    Lisez le PyMOTW sur fnmatch, i.e. ce qu'utilise glob.glob.

    Sinon utilisez os.path.split(fname) pour séparer le chemin du nom.

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

  10. #10
    Nouveau membre du Club
    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
    Points : 27
    Points
    27
    Par défaut
    Bonjour à tous,

    Merci beaucoup pour toutes ces informations, je vais prendre le temps de bien tout lire/comprendre et essayer d'améliorer mon code. Je reviendrais vers vous dès que j'aurais travaillé celui-ci.

    Concernant le chemin un peu chiant, qui m'oblige à créer 36 000 variables, c'est car j'ai essayé de coller à l'architecture que l'on as actuellement. Nous gardons toutes les traces, nous avons donc un dossier pour chaque année, dedans les mois de l'année puis enfin chaque jours de l'année. Mais en finalité, j'aimerais enfête qu'il vérifie si le dossier existe à chaque fois, si non qu'il le créé et que seulement après il fasse une copie. Mais bon, chaque chose en sont temps ^^. Je note ta remarques, de modifié la notation des dossiers par yyyy-mm-dd : yyyy -> yyyy-mm -> yyyy-mm-dd

    Dailleurs petite question, pour vérifier qu'un dossier existe, on utilise bien la fonction du module os.path.isdir ? et os.path.isfile pour les fichiers ?

    Enfin, la fonction shutil.copy créé un tmp_fichier donc, celà fonctionne pareil pour shutil.move ?

    EDIT : Je rencontre un problème avec le fnmatch. En effet, quand je fais ma liste de fichier avec glob, j'ai le chemin, avec fnmatch le nom, du coup avec fnmatch quand je fais le shutil.move par for, sa ne marche pas car il n'a pas le chemin du coup :/

    Merci encore,
    Thomas.

  11. #11
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Bonjour

    juste une petite remarque.

    Il est parfois intéressant, lors de copie de plusieurs/nombreux fichiers, de :

    1. ne pas copier tous les fichiers, un par un, mais d'en faire un "paquet" (une archive, compressée ou pas, ce n'est pas la question)
    2. copier ce paquet et gérer si cette copie unitaire se passe bien ou pas
    3. "ouvrir" le paquet une fois la copie terminée (et validée).



    Ca simplifie, par exemple, le ménage à faire si LA copie se passe mal : si c'est toute une série de fichiers qui sont copiés et, qu'à un moment, une copie se passe mal, pas besoin de reprendre les copies antérieures validées pour les supprimer par exemple.

    Et pour faire les paquets, pas besoin de recoder quoi que ce soit (modules Python zipfile, gzip, tarfile, ... au pire les exécutables). De plus, si les fichiers à copier sont organisés dans une arborescence et non pas tous dans un même répertoire, la recréation, si nécessaire, de l'arborescence peut même être automatique en utilisant ces différents outils (à vérifier - avec les exécutables, c'est sur)
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par BUENOO Voir le message
    Nous gardons toutes les traces, nous avons donc un dossier pour chaque année, dedans les mois de l'année puis enfin chaque jours de l'année.
    "Les traces" sont une collections de fichiers.
    "Garder toutes les traces" signifie les stocker dans un ou plusieurs endroits.
    Organiser cela de façon hiérarchique peut permettre de savoir ou on en est.
    mais on peut très bien se contenter de ranger les ranger les traces du jour "2011-12-06" dans le répertoire:
    • 2011-12-06
    • 2011\2011-12\06
    • 2011-12\06

    mais pourquoi 2011\2011-12\06-12-2011?

    Dailleurs petite question, pour vérifier qu'un dossier existe, on utilise bien la fonction du module os.path.isdir ? et os.path.isfile pour les fichiers ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if not os.path.exists(dname):
         os.mkdir(dname)
    else:
         assert os.path.isdir(dname)
    Enfin, la fonction shutil.copy créé un tmp_fichier donc, celà fonctionne pareil pour shutil.move ?
    ? Je ne pense pas que shutil.copy(src, dst) crée de fichier temporaire.
    ? shutil.move effectue des "rename"

    EDIT : Je rencontre un problème avec le fnmatch. En effet, quand je fais ma liste de fichier avec glob, j'ai le chemin, avec fnmatch le nom, du coup avec fnmatch quand je fais le shutil.move par for, sa ne marche pas car il n'a pas le chemin du coup :/
    glob est pas mal lorsqu'on travaille sur des arborescences.
    vous travaillez (sauf erreur de ma part) sur des fichiers contenus dans un répertoires sources et des répertoires destinations.

    vous pourriez "encapsuler" les appels à shutil.move par le code "métier" (*) suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def my_move(src, fname, *dst):
         s = os.path.join(src, fname)
         for d in dst:
              t = os.path.join(d, fname)
              if not os.path.exists(t):
                    tmp = os.path.join(d, 'tmp_' + fname)
                    os.copy(s, tmp)
                    os.rename (tmp, t)
    (*) cela réalise la fonction de "base" après on peut habiller cela avec des traitements d'erreurs, le log...
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Les copies "groupées"...

    Citation Envoyé par plxpy
    Il est parfois intéressant, lors de copie de plusieurs/nombreux fichiers, de :
    1. ne pas copier tous les fichiers, un par un, mais d'en faire un "paquet" (une archive, compressée ou pas, ce n'est pas la question)
    2. copier ce paquet et gérer si cette copie unitaire se passe bien ou pas
    3. "ouvrir" le paquet une fois la copie terminée (et validée).
    Ca remplace une itération:
    - N fichiers * copy
    par la séquence:
    - emballer N fichiers, copy, déballer N fichiers.
    Il est probable que ce soit plus efficace si la copy se fait entre deux systèmes via le réseau. Mais dans ce cas, il vaut mieux séparer génération des fichiers à copier, transferts, déballage en 3 process séparés.

    Citation Envoyé par plxpy Voir le message
    Ca simplifie, par exemple, le ménage à faire si LA copie se passe mal : si c'est toute une série de fichiers qui sont copiés et, qu'à un moment, une copie se passe mal, pas besoin de reprendre les copies antérieures validées pour les supprimer par exemple.
    Ben on aura ou pas copié un gros fichier.
    Mais si la séquence:
    - emballer N fichiers, copy, déballer N fichiers.
    se vautre, on recommence à partir d'où?
    Comme le nombre de fichiers "source" peut évoluer dans le temps: ce qu'il y a
    dans le .tar n'est plus "à jour"... donc il faudra le refaire et pointer les fichiers unitaires qui ont déjà été bien copié.
    C'est une bonne idée, mais c'est plus compliqué.


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

  14. #14
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Il est probable que ce soit plus efficace si la copy se fait entre deux systèmes via le réseau.
    C'est effectivement dans ce contexte là (copie réseau) que j'utilise le plus souvent cette technique. Mais pas uniquement. Quand ce sont des parties d'arborescences que je dois copier, il m'arrive de l'utiliser aussi en m'appuyant sur l'outil d'archivage qui gère, au moins aussi bien que moi, ces aspects.

    Mais dans ce cas, il vaut mieux séparer génération des fichiers à copier, transferts, déballage en 3 process séparés.
    Je ne comprends pas. process au sens processus / process système ?

    Mais si la séquence:
    - emballer N fichiers, copy, déballer N fichiers.
    se vautre, on recommence à partir d'où?
    Comme le nombre de fichiers "source" peut évoluer dans le temps: ce qu'il y a
    dans le .tar n'est plus "à jour"... donc il faudra le refaire et pointer les fichiers unitaires qui ont déjà été bien copié.
    Quand je procède de la sorte, c'est que la copie est l'étape sensible.

    Une fois les premiers tâtonnements et réglages du début terminés, l'archivage (tar c...) et le désarchivage (tar x...) ne posent pas/plus de problème : environnement "non hostile" (permissions OK), disques jamais pleins (vérifications régulières par ailleurs).

    Donc, quand ça se vautre, c'est la copie qui est en cause. Elle ne se fait pas du tout ou n'est que partielle. Je reprends donc (quand le réseau est à nouveau OK) du début ou à la copie, c'est selon, après avoir fait le ménage si nécessaire.

    Et l'avantage du fichier unique (archive) est que, en cas de copie partielle, l'archive (incomplète) sur la machine cible est facilement identifiable et supprimable.

    Enfin, pour moi, l'archive est générée à chaque opération, sans mise à jour. Une fois qu'elle a servi, on jette.

    Après il y a d'autres choses à prendre en compte, notamment :

    • la taille des fichies à copier : si les fichiers sont "gros", on n'a peut-être pas envie de refaire les copies qui se sont bien passées (donc, l'option archive : c'est pas bon)
    • dans certains cas, des fichiers peuvent ne pas être autonomes et doivent être utilisés ensemble; on peut préférer un comportement binaire : c'est tout bon ou tout mauvais (là, l'archive est intéressante)


    Dans le cas posté, en local, ce n'est sans doute pas nécessaire de passer par là. Mon post était juste une autre approche qui peut être intéressante dans certains cas
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  15. #15
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,
    Je ne comprends pas. process au sens processus / process système ?
    Je parlais d'ensemble d'activités potentiellement indépendantes et donc pouvant donner lieu à process "systèmes" différents.

    Lorsqu'on a N*fichiers au départ et s'assurer qu'on a bien les N*fichiers à l'arrivée avec un zip/unzip (ou autre) au milieu "complique" l'opération si on la considère de bout en bout.

    Pour simplifier on sépare les 3 étapes et on se retrouve in fine à copier des fichiers "plus gros" entre A et B sans se poser la question de qui dépose dans A et qui consomme dans B.

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

  16. #16
    Nouveau membre du Club
    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
    Points : 27
    Points
    27
    Par défaut
    Bonjour,

    Tout d'abord bonne fête à vous

    Après avoir pas mal bouquiner de documentation sur ce que vous me proposiez, j'ai réussit à proposé quelque chose de fonctionnel mais pas optimiser comme je le souhaites (ce qui est en cours).

    Voici ma fonction de test des chemins, qui fonctionne niquel :

    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
     
    # -*- coding: latin-1 -*
     
    import os
    from datetime import date, timedelta
     
    ## ### Création des fonctions qui seront utilisé ### ##
     
    def testpath(x):
    	"""Fonction de test du chemin"""
    	today = date.today()
    	yesterday = date.today()-timedelta(days=1)
    	dest = os.path.join('D:\\test\\source', x, str(yesterday.year), str(yesterday.month), str(yesterday.day))
    	print('Bonjour, test de l\'existance de "', dest, '" en cours ...\n')
    	log = open("D:\\test\\source\\log_trace", "a")
    	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 IOError:
    			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))
    La fonction de copie des fichiers, le code fonctionne hors fonction, dans une fonction par l'interpréteur, mais dès que je l'utilises dans la fonction à partir d'un fichier .py celui ci ne fonctionne 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
     
    # -*- coding: latin-1 -*
     
    import os, shutil, glob
    from datetime import date, timedelta
     
    ## ### Création des fonctions qui seront utilisé ### ##
     
    def copietrace(x):
    	"""Fonction de copie des traces"""
    	yesterday = date.today()-timedelta(days=1)
    	name_file = '*_%s.txt' % yesterday
        source = os.path.join('D:\\test\\source', x, name_file)
    	dest = os.path.join('D:\\test\\source', x, str(yesterday.year), str(yesterday.month), str(yesterday.day))
    	lfile = glob.glob(source)
    	for file in lfile:
    		shutil.copy(file, dest)

  17. #17
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par BUENOO Voir le message
    La fonction de copie des fichiers, le code fonctionne hors fonction, dans une fonction par l'interpréteur, mais dès que je l'utilises dans la fonction à partir d'un fichier .py celui ci ne fonctionne pas :
    Hum... tu utilises beaucoup trop le mot "fonction" à propos de concepts qui me semblent différents.
    De quelle façon utilises-tu ta fonction copietrace() ???
    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]

  18. #18
    Nouveau membre du Club
    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
    Points : 27
    Points
    27
    Par défaut
    Oui je n'es pas encore le vocabulaire forcément adéquat, je continues à étudier le language par le biais d'un bouquin que j'ai acheté et divers tutoriel trouvé sur le web. Sa va venir

    J'ai essayé de l'utiliser en mettant à la fin du script, copietrace('n2c') par exemple, mais sa ne marche pas

  19. #19
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par BUENOO Voir le message
    Code python : 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
    # -*- coding: latin-1 -*
     
    import os, shutil, glob
    from datetime import date, timedelta
     
    ## ### Création des fonctions qui seront utilisé ### ##
     
    def copietrace(x):
    	"""Fonction de copie des traces"""
    	yesterday = date.today()-timedelta(days=1)
    	name_file = '*_%s.txt' % yesterday
        source = os.path.join('D:\\test\\source', x, name_file)
    	dest = os.path.join('D:\\test\\source', x, str(yesterday.year), str(yesterday.month), str(yesterday.day))
    	lfile = glob.glob(source)
    	for file in lfile:
    		shutil.copy(file, dest)
    J'ai essayé de l'utiliser en mettant à la fin du script, copietrace('n2c') par exemple, mais sa ne marche pas
    A ce niveau, il te faut insérer du print dans ta fonction. Afficher les variables source, dest, lfile, vérifier que tout est cohérent par rapport à tes répertoires...
    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]

  20. #20
    Nouveau membre du Club
    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
    Points : 27
    Points
    27
    Par défaut
    Enfête mon problème c'est que les chemins sont cohérent, car si je reprend mes lignes de codes, que je définies ma variable x = 'n2c', celà fonctionne (le transfert des fichiers a bien lieu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    x = 'n2c'
    yesterday = date.today()-timedelta(days=1)
    name_file = '*_%s.txt' % yesterday
    source = os.path.join('D:\\test\\source', x, name_file)
    dest = os.path.join('D:\\test\\source', x, str(yesterday.year), str(yesterday.month), str(yesterday.day))
    lfile = glob.glob(source)
    for file in lfile:
         shutil.copy(file, dest)

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