Python, как отследить изменение файла?

Мне нужно отследить изменение конкретного файла по конкретному пути(именно факт того что файл изменили, а не сами изменения), я написал код:

import os
import shutil
import time

class someclass:
    def __init__(self):
        if not os.path.isdir("temp"):
            os.mkdir("temp")
            os.chdir("temp")
        else:
            os.chdir("temp")

    def watch_file_update(self, filepath):
        if os.path.exists(filepath):
            # Копирую файл в temp
            shutil.copy(filepath, os.getcwd())
            while True:
                time.sleep(1)
                if not os.path.exists(filepath):
                    # Если в процессе файл удалят, переименуют или ещё что, то я возвращаю -2
                    return -2
                else:
                    # Сравниваю файл в temp с оригиналом 
                    with open(filepath, 'r') as f1:
                        with open(f'{os.getcwd()}/{os.path.basename(filepath)}', 'r') as f2:
                            if not f1.read() == f2.read():
                                return 1
        else:
            return -1


if __name__ == "__main__":
    api = someclass()
    if api.watch_file_update("D:/somefile.txt") == 1:
        # Сделать что-либо
    elif api.watch_file_update("D:/somefile.txt") == -1:
        print("Ошибка, файл не найден")
    elif api.watch_file_update("D:/somefile.txt") == -2:
        print("Ошибка, возможно файл был перемещён или удалён")

Код абсолютно рабочий, только есть одна загвоздка, он подходит разве что для файлов меньше 1мб, иначе же он жрёт невероятно много ресурсов компа и работает невероятно медленно, может есть какой-то другой способ отследить изменение файла, или может существует волшебная библиотека для отслеживания изменения файла?


Ответы (2 шт):

Автор решения: Евгений

Можно сравнивать не содержимое файлов, а дату последнего редактирования файла. Её можно получить с помощью модуля os:

import os

def watch_file_update(path):
  timestamp = os.stat(path).st_mtime
  while 1:
    if timestamp != os.stat(path).st_mtime:
      timestamp = os.stat(path).st_mtime
      print('Файл изменён!') 
      return

watch_file_update("D:/somefile.txt")
→ Ссылка
Автор решения: inzem77

Или использовать md5 хеширование. Памяти жрет немного и будете точно уверены, что файлы идентичен. Но если это не принципиально, то лучше использовать первый вариант, так как более простой и быстрый

import hashlib

with open("your_filename.png", "rb") as f:
    file_hash = hashlib.md5()
    while chunk := f.read(8192):
        file_hash.update(chunk)

print(file_hash.digest())
print(file_hash.hexdigest()) 
→ Ссылка