0
votes

Comment puis-je obtenir des changements dans un répertoire en python

J'essaie d'obtenir la dernière modification d'un répertoire, pas seulement le dernier fichier modifié.

J'ai ce code jusqu'à présent: p> xxx pré>

ce qu'il fait Il est imprimé sur la dernière modification du répertoire (actuellement u: code>) p>

Voici quelques sorties d'échantillon: P>

INFO:root:Source directory is U:
INFO:root:File created: U:New Text Document.txt 
INFO:root:File modified: U:New Text Document.txt
INFO:root:File deleted: U:New Text Document.txt
INFO:root:Directory created: U:New Folder
INFO:root:File created: U:New Folder\New Text Document.txt 
INFO:root:File modified: U:New Folder\New Text Document.txt 
INFO:root:File deleted: U:New Folder\New Text Document.txt 
INFO:root:Directory created: U:New Folder\New Folder
INFO:root:Directory created: U:New Folder\New Folder\New Folder
INFO:root:Directory deleted: U:New Folder\New Folder\New Folder
INFO:root:Directory deleted: U:New Folder


10 commentaires

Je vous conseille d'utiliser un chien de garde plutôt qu'une solution fabriquée sur mesure. Vous trouverez certainement un exemple de code en ligne. Le chien de garde ou une autre bibliothèque de cette telle ne sera pas interrogatoire mais s'appuie sur la notification par le système d'exploitation sur place.


Je vais étudier le module de surveillance, mais comme @alaniwi a pris le temps de produire du code de travail, je lui donnerai la coche.


Je ne suis pas inquiet pour obtenir un uppote. Je crois juste que une solution entraînée par l'événement soutenue par le système d'exploitation est une solution bien meilleure.


@Tarik, quand ai-je dit de donner des upvotes? S'il vous plaît, corrigez-moi si je deviens fou, mais je n'ai jamais rien dit de donner des upvotes. Alaniwi a passé du temps précieux à répondre à ma question avec code, pas de lien vers un module, je vais donc accepter sa réponse.


Oh, et j'utilise le module de surveillance en ce moment BTW.


Vous avez soulevé la chèque plus d'une fois et je vous ai dit que ce n'est pas mon inquiétude. Vous vous êtes senti en quelque sorte important de me rappeler et d'insister sur le fait que le code prête rendait votre journée et méritait la démarche. Donc, je me réponds simplement que je ne me soucie pas et je crois que Joelhed et j'ai proposé une solution de meilleure qualité.


Ahh, ok que. J'aurais attendu que vous auriez répondu à mon commentaire sous votre réponse, pas ici, ce qui est vraiment déroutant. Peut-être qu'un exemple d'utilisation de la bibliothèque aurait pu aider un peu, mais cela n'a pas d'importance maintenant pour moi. J'ai déjà reçu mon code avec votre solution proposée. J'essayais juste d'être gentil. Je m'excuse si je vous ai offensé.


Hey, ça va. À mon âge, je devrais être plus sage qu'une réactivation stupidement de réagir. Mes excuses.


Non ça va. Je suis désolé d'être une tête d'os. Et j'apprécie votre réponse sur le module de surveillance. Le code axé sur l'événement ressemble et fonctionne beaucoup mieux maintenant.


Et, trop réagir signifie que vous êtes passionné à ce sujet. C'est bon :)


3 Réponses :


1
votes

Ce dont vous avez besoin est une bibliothèque de surveillance de dossiers qui est entraînée par l'événement. Par exemple, https://pypi.org/project/watchdog/

Pour plus, Google Out Python Dossier Watcher

Il est probablement dépendant du système d'exploitation.


1 commentaires

Merci d'avoir pris le temps de répondre à ma question! J'ai marqué @ Réponse de Alaniwi en tant que réponse car elle dispose de code de travail, mais je vais vérifier la bibliothèque de surveillance!



1
votes

Ceci est définitivement possible, je veux dire, tout est possible! Cela pourrait être un peu complexe cependant, je vous recommande donc d'utiliser une bibliothèque comme watchDog , qui accroche à la surveillance du système de fichiers du système d'exploitation Thingamabob.


2 commentaires

Merci d'avoir pris le temps de répondre à ma question! Je vais vérifier le module de surveillance.


En outre, 1+ pour utiliser le terme scientifique Thingamabob.



1
votes

Pour ce que ça vaut la peine, si vous besoin em> utiliser un scanner de sondage, voici une implémentation. Sous réserve des mises en garde évidentes sur la performance, et il ne remarque pas de fichiers qui apparaissent et disparaissent à nouveau entre intervalles de sondage.

import time
import pathlib
import logging

logging.basicConfig(level=logging.DEBUG)


def get_paths(path):
    answer = {}
    for x in pathlib.Path(path).rglob("*"):
        try:
            answer[str(x)] = (x.stat().st_ctime, x.is_dir())
        except FileNotFoundError:
            pass
    return answer


def log(name, is_dir, action):
    descrip = "Directory" if is_dir else "File"
    logging.info("{} {}: {}".format(descrip, action, name))
    

def scan(top_dir, sleep_time):

    old_paths = get_paths(top_dir)
    s_old_paths = set(old_paths)

    while True:
        time.sleep(sleep_time)
        new_paths = get_paths(top_dir)
        s_new_paths = set(new_paths)
        cre_names = s_new_paths - s_old_paths
        del_names = s_old_paths - s_new_paths

        for name in cre_names:
            _, is_dir = new_paths[name]
            log(name, is_dir, "created")

        for name in del_names:
            _, is_dir = old_paths[name]
            log(name, is_dir, "deleted")

        for name in s_old_paths & s_new_paths:
            new_time, is_dir = new_paths[name]
            old_time, _ = old_paths[name]
            if new_time != old_time:
                log(name, is_dir, "modified")

        old_paths = new_paths
        s_old_paths = s_new_paths
    

top_dir = "U:"
sleep_time = 10
scan(top_dir, sleep_time)


2 commentaires

Merci beaucoup d'avoir pris le temps de répondre à ma question! Je vais marquer cela comme la bonne réponse, car il a réel code et cela fait ce dont j'ai besoin


@Unsigned_arduino, vous êtes le bienvenu. Je n'ai pas écrit une grande partie d'une description, mais comme vous pouvez le constater, il utilise des dictionnaires de path_name: (ctime, is_dir) et compare simplement le courant avec le précédent à chaque fois. Évidemment, quelque chose d'événement axé sur le potentiel d'être une meilleure solution si réellement mis en œuvre.