Страницы

Поиск по вопросам

воскресенье, 2 февраля 2020 г.

Как отслеживать изменения файлов и копировать изменённые файлы в другую папку?

#python #python_3x


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

Так вот проблема в том, что у меня есть список файлов, полученный с помощью функции
**os.listdir(path)*. Но его содержимое - всего лишь текст. Как я могу привязать элементы
к реальным файлам?
    


Ответы

Ответ 1



Для полноты картины не хватает ответа с https://pypi.python.org/pypi/inotify import logging import inotify.adapters _DEFAULT_LOG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s' _LOGGER = logging.getLogger(__name__) def _configure_logging(): _LOGGER.setLevel(logging.DEBUG) ch = logging.StreamHandler() formatter = logging.Formatter(_DEFAULT_LOG_FORMAT) ch.setFormatter(formatter) _LOGGER.addHandler(ch) def _main(): i = inotify.adapters.Inotify() i.add_watch('/tmp') try: for event in i.event_gen(): if event is not None: (header, type_names, watch_path, filename) = event _LOGGER.info("WD=(%d) MASK=(%d) COOKIE=(%d) LEN=(%d) MASK->NAMES=%s " "WATCH-PATH=[%s] FILENAME=[%s]", header.wd, header.mask, header.cookie, header.len, type_names, watch_path, filename) finally: i.remove_watch('/tmp') if __name__ == '__main__': _configure_logging() _main() i.event_gen() yield-ит события о изменении файлов в каталоге.

Ответ 2



Как-то так: import os import time for fname in os.listdir(): t = os.path.getmtime(fname) print ("modification time of '{}' is {}".format(fname, time.ctime(t))) current_mtime[fname] = t if t > last_mtime[fname]: do_something(fname) last_mtime = current_mtime

Ответ 3



Сидя на Linux, можно не городить костыли, а воспользоваться возможностью, предоставляемой ОС - inotify и специальным демоном, который облегчает работу - incron. Работает incron крайне легко и приятно. Например, строчка из incrontab файла: /home IN_CREATE /home/user/my_cool_python_script.py $# означает, что, когда в каталоге /home создан каталог или файл, будет вызван указанный скрипт с параметром, означающим имя файла, с которым произошло наблюдаемое событие.

Ответ 4



Вот рабочий вариант с использованием Watchdog. Я слегка модифицировал этот пример (c) Bruno Rocha watch_for_changes.py: from __future__ import print_function import os import sys import time import shutil from watchdog.observers.polling import PollingObserverVFS from watchdog.events import PatternMatchingEventHandler class MyHandler(PatternMatchingEventHandler): #patterns = ["*.*", ".*"] def __init__(self, target_dir, **kwargs): PatternMatchingEventHandler.__init__(self, **kwargs) self._target_dir = target_dir def process(self, event): """ event.event_type 'modified' | 'created' | 'moved' | 'deleted' event.is_directory True | False event.src_path path/to/observed/file """ if not event.is_directory: # the file will be processed there print('{} {} --> {}'.format(event.src_path, event.event_type, self._target_dir)) shutil.copy(event.src_path, self._target_dir) def on_modified(self, event): self.process(event) def on_created(self, event): self.process(event) if __name__ == '__main__': args = sys.argv[1:] source_dir = args[0] target_dir = args[1] observer = PollingObserverVFS(stat=os.stat, listdir=os.listdir, polling_interval=30) observer.schedule(MyHandler(target_dir, patterns=['*.*','*','.*']), path=source_dir) observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join() Как вызывать: python watch_for_changes.py c:\source_dir c:\target_dir PS в теории это должно работать на любой платформе где поддерживается Python, на практике я проверил только под Windows...

Ответ 5



Если к речь о файлах то можно сделать с помощь словаря: import os fdict = {} path = "путь_к_директории_с_файлами" files = os.listdir(path) for i in files: if isfile(path+i): fdict[i] = open(path+i,'r') Этот скрипт создаёт словарь файлов с ключами - их названиями. Пример выбора файла из него: fdict["имя_файла"]

Комментариев нет:

Отправить комментарий