IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Débutant en Python : comment surveiller un répertoire pour déclencher une action


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    ex-informaticien photographe
    Inscrit en
    Septembre 2021
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : ex-informaticien photographe
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2021
    Messages : 37
    Points : 9
    Points
    9
    Par défaut Débutant en Python : comment surveiller un répertoire pour déclencher une action
    Salut à tous, je suis un ex-informaticien qui se reconvertit dans la photo. J'ai fait de la programmation avec toutes sortes de langages dans ma prime jeunesse mais depuis 15 ans je faisais du décisionnel donc BO, Microstrategy, ETL divers... Sans oublier du SQL bien sur !

    Pour ma nouvelle activité j'ai un besoin très spécifique : lors de séances photos dans les écoles j'ai un grand nombre d'élèves à photographier et le tri des photos est plutôt rébarbatif ensuite, avec un risque d'erreur non négligeable !
    Je voudrais donc faire une petite appli pour :
    - Récupérer la liste des élèves depuis un fichier (txt, csv, Excel... Peu importe) qui serait affiché dans une interface très simple permettant de sélectionner l'élève que je vais prendre en photo. Voire même soyons fou charger mes listes d'élèves dans une petite base MySql par exemple, ce qui simplifierait peut-être les choses...
    - Surveiller l'arrivée des photos dans un répertoire spécifique et renommer les fichiers au fur et à mesure avec le nom de l'élève sélectionné dans la liste et une numérotation si plusieurs photos

    Je suis sous Windows.

    Je me disais qu'on devait pouvoir faire ça avec Python ? Merci de votre aide !!!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 355
    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 355
    Points : 36 883
    Points
    36 883
    Par défaut
    Salut,

    Citation Envoyé par Vincent-vr Voir le message
    Je me disais qu'on devait pouvoir faire ça avec Python
    A la base, c'est un problème de "programmation": on commence par reformuler le besoin en quelque chose de plus comestible par l'univers des machines en le découpant en une suite d'activités à réaliser.

    Puis on le reformule ce travail de conception avec son langage préféré...

    Ce qui ne présente pas de difficulté si on le maîtrise.
    On peut même faire une conception plus ou moins neutre vis à vis du langage qu'on va utiliser.

    note: et j'oubliais de signaler que s'agissant de données personnelles, il faut voir dans quelle mesure l'application sera conforme aux lois en vigueur (du côté CNIL).

    - W

  3. #3
    Futur Membre du Club
    Homme Profil pro
    ex-informaticien photographe
    Inscrit en
    Septembre 2021
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : ex-informaticien photographe
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2021
    Messages : 37
    Points : 9
    Points
    9
    Par défaut
    Certes...
    Sauf qu'en tant que particulier je n'ai pas de langage préféré ! J'ai fait du développement dans des environnements pros sur des gros et moyens systèmes : AS400, BULL... Je pense pas que le RPG ou le Cobol soient des choix pour une appli Windows D'où l'idée de me mettre au Python... Donc en plus clair : peut-on surveiller un répertoire avec Python ? Pour le reste je n'ai pas trop d'inquiétude

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 355
    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 355
    Points : 36 883
    Points
    36 883
    Par défaut
    Citation Envoyé par Vincent-vr Voir le message
    Donc en plus clair : peut-on surveiller un répertoire avec Python ? Pour le reste je n'ai pas trop d'inquiétude
    La façon la plus simple est de regarder son contenu à intervalle régulier...

    Plus compliqué sera d'utiliser des fonctionnalités systèmes qui peuvent être event-driven et de récupérer une bibliothèque qui permet de l'utiliser pour le programmeur Python.

    - W

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Vincent-vr Voir le message
    Donc en plus clair : peut-on surveiller un répertoire avec Python ?
    Tout à fait. os.listdir(rep) te donne la liste de ce qui se trouve dans le dossier "rep". Un coup de os.stat() te permet d'analyser la nature d'un fichier style "est-il vrai fichier ou alors dossier?" (car pour un OS tout ce qui se trouve sur le disque est "fichier" et simplement certains fichiers ne sont pas de même nature que d'autres). Ensuite tu peux enrober tout ça dans une boucle infinie en lui mettant une tempo à base de time.sleep() pour éviter qu'elle ne tourne à 60000 tours/secs (dont 59999 fois pour rien) et tu as ton outil de surveillance.

    Ensuite si tu veux te lancer dans le haut de gamme, alors tu y rajoutes une surcouche IHM (par exemple PyQt) dans laquelle tu peux y mettre un timer pour qu'il ne s'active qu'à intervalles réguliers. Voire mettre ton outil en zone de notification pour qu'il ne s'ouvre que quand quelque chose le mérite et voilà...

  6. #6
    Invité
    Invité(e)
    Par défaut
    Salutation !

    Toujours aussi excellent ce Tim Golden : http://timgolden.me.uk/python/win32_...r_changes.html

    3 méthodes pour le prix d'une !

    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
    import os
     
    import win32file
    import win32event
    import win32con
     
    path_to_watch = os.path.abspath (".")
     
    #
    # FindFirstChangeNotification sets up a handle for watching
    #  file changes. The first parameter is the path to be
    #  watched; the second is a boolean indicating whether the
    #  directories underneath the one specified are to be watched;
    #  the third is a list of flags as to what kind of changes to
    #  watch for. We're just looking at file additions / deletions.
    #
    change_handle = win32file.FindFirstChangeNotification (
      r'C:\Users\***\Desktop',
      0,
      win32con.FILE_NOTIFY_CHANGE_FILE_NAME
    )
     
    #
    # Loop forever, listing any file changes. The WaitFor... will
    #  time out every half a second allowing for keyboard interrupts
    #  to terminate the loop.
    #
    try:
     
      old_path_contents = dict ([(f, None) for f in os.listdir (path_to_watch)])
      while 1:
        result = win32event.WaitForSingleObject (change_handle, 500)
     
        #
        # If the WaitFor... returned because of a notification (as
        #  opposed to timing out or some error) then look for the
        #  changes in the directory contents.
        #
        if result == win32con.WAIT_OBJECT_0:
          new_path_contents = dict ([(f, None) for f in os.listdir (path_to_watch)])
          added = [f for f in new_path_contents if not f in old_path_contents]
          deleted = [f for f in old_path_contents if not f in new_path_contents]
          if added: print("Added: ", ", ".join (added))
          if deleted: print("Deleted: ", ", ".join (deleted))
     
          old_path_contents = new_path_contents
          win32file.FindNextChangeNotification (change_handle)
     
    finally:
      win32file.FindCloseChangeNotification (change_handle)

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    Toujours aussi excellent ce Tim Golden : http://timgolden.me.uk/python/win32_...r_changes.html
    old_path_contents = dict ([(f, None) for f in os.listdir (path_to_watch)])
    Dommage ces crochets inutiles => old_path_contents = dict ((f, None) for f in os.listdir (path_to_watch)).

    Et ce n'est pas anodin comme erreur. Les crochets (listes) entrainent une génération complète de la liste avant évaluation. Alors que sans les crochets, cela donne un itérable qui est alors évalué durant l'itération. Et si l'évaluation amène une certitude, alors elle est interrompue ce qui optimise le truc.
    Exemple

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    def fct(n):
    	print(n)
    	return n==5
     
    >>> print(any([fct(x) for x in range(10)]))
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    True
     
    >>> print(any(fct(x) for x in range(10)))
    0
    1
    2
    3
    4
    5
    True

  8. #8
    Invité
    Invité(e)
    Par défaut
    @Sve@r Ca a une importance dans son code ?
    Sinon si on veut que ça s'arrête on peut répéter la condition dans la comphresion list, non ?
    print(any([fct(x) for x in range(10) if x <=5]))C'est certainement pas un gain de temps par contre...

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 355
    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 355
    Points : 36 883
    Points
    36 883
    Par défaut
    Salut,

    Citation Envoyé par LeNarvalo Voir le message
    @Sve@r Ca a une importance dans son code ?
    On trouve toujours des "pourrait mieux faire" dans le code des autres.

    Peut être que le code a été écrit avant que dict accepte des itérables en paramètre (c'est au mieux en Python 2.3 et pywin32 est bien plus ancient)....

    Tant que le vieux code ne casse pas, ou que quelqu'un ne reporte pas la chose dans la buglist, ça ne va pas être revisité au cas où ça ferait plus joli.

    - W

  10. #10
    Futur Membre du Club
    Homme Profil pro
    ex-informaticien photographe
    Inscrit en
    Septembre 2021
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : ex-informaticien photographe
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2021
    Messages : 37
    Points : 9
    Points
    9
    Par défaut
    Merci pour les tuyaux ! Je vais essayer tout ça !
    Et pour une IHM simple et efficace, vous recommandez quoi ?

  11. #11
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 914
    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 914
    Points : 7 298
    Points
    7 298
    Par défaut
    Citation Envoyé par Vincent-vr Voir le message
    Et pour une IHM simple et efficace, vous recommandez quoi ?
    Pour un débutant, Tkinter, qui puis est déjà compris avec Python lors de son installation.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Faudrait peut-être que je me mette à PyQt5 un jour...

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 355
    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 355
    Points : 36 883
    Points
    36 883
    Par défaut
    Citation Envoyé par Vincent-vr Voir le message
    Et pour une IHM simple et efficace, vous recommandez quoi ?
    Pour faire une interface aussi simple que présentée initialement, tkinter suffira largement sans trop besoin de connaissances en POO (que vous n'avez pas dans le monde Cobol/RPG).

    Après faut pas rêver, Python est a des lieues de Cobol. Passer du temps à apprendre les bases s'impose.

    - W

  14. #14
    Futur Membre du Club
    Homme Profil pro
    ex-informaticien photographe
    Inscrit en
    Septembre 2021
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : ex-informaticien photographe
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2021
    Messages : 37
    Points : 9
    Points
    9
    Par défaut
    J'ai aussi fait du Pascal, ADA, C, VB, C#... Mais ça date un peu !

  15. #15
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    @Sve@r Ca a une importance dans son code ?
    Dans son code non. Il génère un dictionnaire, et que le dictionnaire soit créé depuis une liste ou bien depuis un générateur ne change rien à sa création finale. Juste que la création de la liste "en live" pour rien c'est quand-même un travail inutile.
    Ensuite c'est aussi une question d'habitude. Si on prend l'habitude de garder cette écriture avec liste intermédiaire, alors on les créera tout le temps y compris dans les cas où cela sera important...

    Citation Envoyé par LeNarvalo Voir le message
    Sinon si on veut que ça s'arrête on peut répéter la condition dans la comphresion list, non ?
    J'aurais pu te répondre sur tout ce que ça entraine mais je crois qu'une image sera plus explicite...
    Nom : dev.jpeg
Affichages : 451
Taille : 15,3 Ko

    Citation Envoyé par LeNarvalo Voir le message
    C'est certainement pas un gain de temps par contre...
    Ben voilà.

    Citation Envoyé par LeNarvalo Voir le message
    Faudrait peut-être que je me mette à PyQt5 un jour...
    Oui, maintenant que PyQt6 vient de sortir... Mais si tu veux tu peux t'y mettre en commençant ici...

  16. #16
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 914
    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 914
    Points : 7 298
    Points
    7 298
    Par défaut
    Dommage ces crochets inutiles
    Pas sûr que dans les vieilles version 2.x ce genre qu'on semble trouver futile aujourd'hui ne l'était pas avant

    http://timgolden.me.uk/index.html

  17. #17
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Oui, maintenant que PyQt6 vient de sortir... Mais si tu veux tu peux t'y mettre en commençant ici...

    Tellement compliquée cette librairie... Je suis découragé d'avance ! 2h que j'essaye de faire un truc simple en espérant m'épargner la lecture de tutos. Erreur fatale !

  18. #18
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 355
    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 355
    Points : 36 883
    Points
    36 883
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    2h que j'essaye de faire un truc simple en espérant m'épargner la lecture de tutos.
    Passer ces deux heures à essayer de comprendre ce que raconte un tuto. aurait été plus profitable...

    - W

  19. #19
    Futur Membre du Club
    Homme Profil pro
    ex-informaticien photographe
    Inscrit en
    Septembre 2021
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : ex-informaticien photographe
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2021
    Messages : 37
    Points : 9
    Points
    9
    Par défaut
    Merci à tous pour votre aide et les pistes que vous m'avez donné, je me suis lancé et en une matinée j'ai réussi à faire mon interface et à afficher une liste tirée d'un fichier Excel
    Je vais donc continuer sur ma lancée, trop cool ce langage !

  20. #20
    Futur Membre du Club
    Homme Profil pro
    ex-informaticien photographe
    Inscrit en
    Septembre 2021
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : ex-informaticien photographe
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2021
    Messages : 37
    Points : 9
    Points
    9
    Par défaut
    Bon, me revoilà déjà avec un léger soucis : comment je fais pour que pendant l'exécution de la boucle de "scrutation" le programme me rende la main ? J'aurais bien aimé faire un bouton "arrêt de surveillance du répertoire", histoire de pouvoir changer le dit répertoire entre 2 classes par exemple... Voire même "en live" et toc il change sa surveillance !

Discussions similaires

  1. Réponses: 5
    Dernier message: 10/08/2011, 11h16
  2. comment surveiller un répertoire à distance?
    Par rainy_kll dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 08/07/2010, 18h04
  3. Réponses: 2
    Dernier message: 31/12/2008, 12h16
  4. Réponses: 7
    Dernier message: 21/10/2004, 09h13
  5. [PowerAMC] Comment s'en servir pour creer une base?
    Par Elmilouse dans le forum Access
    Réponses: 2
    Dernier message: 27/07/2004, 09h53

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