Как вы проверяете, когда файл копируется в Python?

Я хотел бы выяснить способ оповестить скрипт python о том, что файл завершен копированием. Вот сценарий:

  1. Папка, to_print просматривается сценарием, постоянно опросив с помощью os.listdir() .

  2. Каждый раз, когда os.listdir() возвращает список файлов, в которых существует файл, который ранее не был замечен, скрипт выполняет некоторые операции над этим файлом, включая открытие его и управление его содержимым.

Это хорошо, когда файл небольшой, и копирование файла из исходного источника в просматриваемый каталог занимает меньше времени, чем количество оставшегося времени до следующего опроса os.listdir() . Однако, если файл опрошен и найден, но он все еще находится в процессе копирования, содержимое файла повреждается, когда скрипт пытается действовать на нем.

Вместо этого я хотел бы иметь возможность (используя os.stat или иначе) знать, что файл в настоящее время скопирован, и дождаться его выполнения до тех пор, пока я не поступлю на него, если это так.

Моя нынешняя идея – использовать os.stat() каждый раз, когда я нахожу новый файл, а затем дождаться следующего опроса и сравнить время, измененное / созданное с момента последнего опроса, и если они останутся прежними, тогда этот файл «стабильный», в противном случае держать опрос до тех пор, пока он не будет. Я не уверен, что это сработает, хотя я не слишком хорошо знаком с тем, как Linux / Unix обновляет эти значения.

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

     while True: newfiles = check_for_new_files() process(newfiles) time.sleep(pollinterval) 

    Сделай это:

     newfiles = [] while True: process(newfiles) newfiles = check_for_new_files() time.sleep(pollinterval) 

    Или просто поместите ожидание в середине цикла (тот же эффект действительно):

     while True: newfiles = check_for_new_files() time.sleep(pollinterval) process(newfiles) 

    Попробуйте inotify .

    Это стандарт Linux для просмотра файлов. Для вашего прецедента событие IN_CLOSE_WRITE кажется многообещающим. Существует библиотека Python для inotify . Очень простой пример (взятый оттуда ). Вам нужно будет изменить его, чтобы поймать только события IN_CLOSE_WRITE .

     # Example: loops monitoring events forever. # import pyinotify # Instanciate a new WatchManager (will be used to store watches). wm = pyinotify.WatchManager() # Associate this WatchManager with a Notifier (will be used to report and # process events). notifier = pyinotify.Notifier(wm) # Add a new watch on /tmp for ALL_EVENTS. wm.add_watch('/tmp', pyinotify.ALL_EVENTS) # <-- replace by IN_CLOSE_WRITE # Loop forever and handle events. notifier.loop() 

    Вот обширная документация по API: http://seb-m.github.com/pyinotify/