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")
Или использовать 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())