Как получить изменения в каталоге в Python - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь получить последнее изменение в каталоге, а не только последний измененный файл.

Пока у меня есть этот код:

import pathlib
import logging

# Set logging level
logging.basicConfig(level=logging.DEBUG)

# Define some paths
source_path = pathlib.Path("U:")

logging.info(f"Source directory is {source_path}")

# Latest path
latest_path = max(source_path.glob('*'),
                  key=lambda path: path.stat().st_ctime)
last_path = None

while True:
    try:
        # Latest path
        latest_path = max(source_path.glob('*'),
                          key=lambda path: path.stat().st_ctime)
    except FileNotFoundError:
        pass
    if not latest_path == last_path:
        logging.info(f"Last changed path is {latest_path}")
        last_path = latest_path

Что он делает, так это print из последних изменений в каталоге (в настоящее время U:)

Вот пример вывода:

INFO:root:Source directory is U:
INFO:root:Last changed path is U:Website Downloader
INFO:root:Last changed path is U:New Text Document.txt <-- Created it
INFO:root:Last changed path is U:hi.txt <-- Renamed it
INFO:root:Last changed path is U:Website Downloader <-- Deleted hi.txt
INFO:root:Last changed path is U:New folder <-- Created it
INFO:root:Last changed path is U:hi <-- Renamed it
INFO:root:Last changed path is U:Website Downloader <-- Deleted hi (directory)

Он пропустил такие вещи, как сохранение изменений в файлах в базовом каталоге (U:) , новые, измененные и удаленные файлы в каталогах.

Я бы хотел, чтобы он говорил, например:

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

Возможно ли это даже в Python?

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 21 июня 2020

Это определенно возможно, то есть все возможно! Однако это может быть немного сложно, поэтому я бы рекомендовал вам использовать такую ​​библиотеку, как watchdog, которая подключается к функции мониторинга событий файловой системы операционной системы thingamabob.

1 голос
/ 21 июня 2020

Как бы то ни было, если вам нужно для использования сканера опроса, вот реализация. С учетом очевидных оговорок относительно производительности, и он не замечает файлы, которые появляются и снова исчезают между интервалами опроса.

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)
1 голос
/ 21 июня 2020

Что вам нужно, так это библиотека для отслеживания папок, управляемая событиями. Например, https://pypi.org/project/watchdog/

Для получения дополнительной информации Google out python просмотрщик папок

Вероятно, это зависит от операционной системы.

...