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 :

Copier des fichiers selon la date dans un dossier [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien Informatique Support
    Inscrit en
    Octobre 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Informatique Support
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2021
    Messages : 2
    Par défaut Copier des fichiers selon la date dans un dossier
    Bonjour,

    Novice dans le langage Python, je suis actuellement bloqué dans mes recherches. Pour synthétiser ma demande :

    J'ai des fichiers (pêle-mêle) qui se trouvent dans un dossier. Je réalise une copie des fichiers vers un répertoire spécifique indiqué dans le code.

    Ce que je souhaiterais :

    Selon la date de dernière modification du fichier, copier ce dernier dans un dossier mensuel (Octobre, Novembre, ...), créer le dossier si il n'existe pas.

    Voici le code actuellement :

    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
    import os
    import glob
    import shutil
    os.chdir('C:\\') 
     
    dossier_source = r"C:\\Users\\Smillo\\Images\\"
    dossier_cible = r"C:\\Users\\Smillo\\Documents\\Pictures\\"
    copie=0
     
    print("Copie de fichier en cours")
     
    for fich in glob.glob(os.path.join(dossier_source,"*.*")): 
        if os.path.isfile(fich): 
            shutil.copy2(fich, dossier_cible) 
            os.remove(fich)
            print(fich, " : copié")
            copie+=1
    print(copie, " Fichiers copiés")
    J'ai vu quelques commandes pour vérifier la dernière date de modification mais pas d'enchainement avec une copie et création de dossier mensuel si il n'existe pas.
    Je vous prie de m'excuser si ce n'est pas clair ^^

    Merci par avance pour vos retour.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 761
    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 761
    Par défaut
    Citation Envoyé par Smillotheque Voir le message
    J'ai vu quelques commandes pour vérifier la dernière date de modification mais pas d'enchainement avec une copie et création de dossier mensuel si il n'existe pas.
    Si vous utilisez os.path.isfile, vous devriez avoir ouvert la documentation du module os.path.
    Juste en dessous, il y a os.path.isdir.
    Et dans le module os, on trouve os.mkdir.

    C'est vrai que plonger dans la documentation peut sembler intimidant lorsqu'on débute mais vous avez aussi une FAQ avec tout un chapitre sur les fichiers.

    Citation Envoyé par Smillotheque Voir le message
    J'ai vu quelques commandes pour vérifier la dernière date de modification mais pas d'enchainement avec une copie et création de dossier mensuel si il n'existe pas.
    Les séquences de commandes se font selon le besoin: c'est pour çà qu'on programme.

    Sachant quelles fonctions utiliser pour récupérer les différentes informations et agir sur les fichiers, après c'est de la programmation. Vous trouverez rarement la séquence de code qui fera pile poil ce que vous voulez. Pire, si elle passe devant vos yeux comment la reconnaître sans une idée d'à quoi çà peut ressembler?

    Ceci dit apprendre à programmer en bougeant les fichiers est difficile: après un essai, l'état du disque a changé et faire l'essai suivant dans les mêmes conditions pour vérifier la correction demande une initialisation/restoration.
    Peut être qu'avant de bouger les fichiers, vous avez intérêt à exécuter vos commandes à blanc print('os.remove(f"{fich}")' ne modifie pas l'état du disque. Et on peut le rejouer pareil, si on doit revoir la logique.

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

  3. #3
    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
    Bonjour
    Citation Envoyé par Smillotheque Voir le message
    J'ai vu quelques commandes pour vérifier la dernière date de modification mais pas d'enchainement avec une copie et création de dossier mensuel si il n'existe pas.
    Ah ben non. Les modules Python ne t'offrent que des instructions simples (ce truc existe-t-il? est-il fichier? est-il dossier? quelle est sa date?). Ensuite à toi d'associer les informations pour faire ton traitement.
    Exemple avec un fichier
    1. récupérer sa date (os.stat())
    2. extraire le mois de cette date (datetime.strftime())
    3. construire un nom de dossier contenant ce mois (manipulation de strings)
    4. le dossier existe-t-il (os.stat.isdir()). Là petit travail de réflexion (que faire si un fichier de même nom existe déjà???)
    5. si pas dossier le créer (os.mkdir())
    6. déplacer le fichier dans le dossier (os.rename())


    Voilà le plus dur. Une fois l'algorithme bien rodé pour "un" fichier, pas compliqué de l'appliquer pour "tous" les fichiers à traiter.
    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]

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Exemple avec un fichier
    1. récupérer sa date (os.stat())
    2. extraire le mois de cette date (datetime.strftime())
    3. construire un nom de dossier contenant ce mois (manipulation de strings)
    4. le dossier existe-t-il (os.stat.isdir()). Là petit travail de réflexion (que faire si un fichier de même nom existe déjà???)
    5. si pas dossier le créer (os.mkdir())
    6. déplacer le fichier dans le dossier (os.rename())
    Je propose une méthode avec moins d'étapes :
    • Obtenir les dates en français :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import locale, time, os
    locale.setlocale(locale.LC_TIME,'')
    • Récupérer la date de dernière modification : mtime = os.path.getmtime(path), équivalent à : os.stat(path).st_mtime.
    • Obtenir le mois : month = time.strftime('%B', time.localtime(mtime)).capitalize().
    • Essayer de déplacer un fichier avec os.rename(path), si erreur créer le mois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try :
    	os.rename(os.path.expanduser(r'~\Desktop\Test\test.txt'), os.path.expanduser(r'~\Desktop\Test\{}\test.txt'.format(month)))
    except FileNotFoundError:
    	os.mkdir(os.path.expanduser(r'~\Desktop\Test\{}'.format(month)))
    	os.rename(os.path.expanduser(r'~\Desktop\Test\test.txt'), os.path.expanduser(r'~\Desktop\Test\{}\test.txt'.format(month)))
    Je crois que j'ai assez prémâché le boulot !

  5. #5
    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 LeNarvalo Voir le message
    Je propose une méthode avec moins d'étapes :
    Plein d'étapes parce que plein de détails, comme il convient quand on explique les choses à un débutant !!!

    Citation Envoyé par LeNarvalo Voir le message
    • Essayer de déplacer un fichier avec os.rename(path), si erreur créer le mois :
    Hum... là je dis non. Déjà ça ne gère pas le cas du fichier qui existerait avec le nom du répertoire à créer (malchance) qui font partie d'une de mes étapes. Evidemment si tu négliges ce cas, alors c'est facile de me gratter aux étapes.
    Et donc si tu présumes que ce cas ne peut pas se produire (ok tu en as le droit) et que tu veux appliquer le principe Python "on le fait et qui vivra verra" alors tu le fais dans le bon sens: création du répertoire et si erreur parce que déà existant alors on s'en balance ; puis ensuite déplacer le fichier dans le répertoire. Ce qui évite à minima de dupliquer le rename.
    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]

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Plein d'étapes parce que plein de détails, comme il convient quand on explique les choses à un débutant !!!


    Hum... là je dis non. Déjà ça ne gère pas le cas du fichier qui existerait avec le nom du répertoire à créer (malchance) qui font partie d'une de mes étapes. Evidemment si tu négliges ce cas, alors c'est facile de me gratter aux étapes.
    Et donc si tu présumes que ce cas ne peut pas se produire (ok tu en as le droit) et que tu veux appliquer le principe Python "on le fait et qui vivra verra" alors tu le fais dans le bon sens: création du répertoire et si erreur parce que déà existant alors on s'en balance ; puis ensuite déplacer le fichier dans le répertoire. Ce qui évite à minima de dupliquer le rename.
    Ben si le nom du fichier existe déjà ça lève une autre exception qu'il peut aussi gérer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    try:
    	os.rename(old_path, new_path)
     
    except FileNotFoundError:
    	os.mkdir(month)
    	os.rename(old_path, new_path)
     
    except FileExistsError:
    	os.rename(old_path, new_path_renamed) #exemple : os.path.expanduser(r'~\Desktop\test\novembre\{}test.txt'.format(time.time())) comme ça pas de doublon possible
    (PS : Tu n'as pas non plus gérer ce cas de figure ! os.path.exists(path))

    Au sujet du try: os.mkdir(month) je dis non aussi ! ^^ Mon exception sera soulevé 12 fois maximum quant avec ce que tu proposes minimum (nombre_de_fichiers - 12). Et tant pis s'il y a deux fois la même instruction (os.rename(...)) c'est juste esthétique.

    Je pense qu'utiliser un jeu de conditions à chaque fichier est plus lent que de soulever des erreurs dans ce cas de figure, puisqu'il n'y aura que 12 FileNotFoundError et probablement aucun FileExistsError puisque ses fichiers semblent être dans un seul dossier à la base. "J'ai des fichiers (pêle-mêle) qui se trouvent dans un dossier."

    Je pense que sur ce coup là être plus "performant" que toi !
    Je te laisse tester avec timeit tu gères ça plus mieux que moi.

    PS : Par contre oui je t'accorde volontier que ton explication est plus adaptée à un débutant qui n'a que faire d'optimiser son code et ne connaît probablement pas la "méthode" try: except:

  7. #7
    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 LeNarvalo Voir le message
    Ben si le nom du fichier existe déjà ça lève une autre exception qu'il peut aussi gérer
    Ben... justement non, ça l'écrase sans remord (viens de tester juste pour toi )
    Ceci dit, ma solution ne fonctionne pas non plus dans ce cas de figure, car mkdir() va planter cause fichier "month" existe déjà mais si je m'en balance comme je l'ai dit, alors babaye ancien fichier "month" (et dans la même foulée babaye tous les fichiers qui auront été renommés en un seul fichier "month" )
    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]

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

Discussions similaires

  1. Copier des données selon une date
    Par lovelyrory dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 16/01/2018, 17h38
  2. Réponses: 1
    Dernier message: 03/02/2015, 09h52
  3. Réponses: 2
    Dernier message: 19/05/2014, 14h39
  4. Tri des fichiers selon le date ?
    Par genius4evers dans le forum C#
    Réponses: 2
    Dernier message: 29/09/2011, 10h27
  5. Boucle en Dos pour lister des fichiers selon une date
    Par Corben dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 17/12/2005, 12h17

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