Библиотека Python, чтобы определить, изменился ли файл между разными прогонами? - PullRequest
7 голосов
/ 16 декабря 2009

Предположим, у меня есть программа A. Я запускаю ее и выполняю некоторые операции, начиная с файла foo.txt. Теперь А заканчивается.

Новый запуск A. Он проверяет, изменился ли файл foo.txt. Если файл изменился, A снова начинает свою работу, в противном случае он завершает работу.

Существует ли библиотечная функция / внешняя библиотека для этого?

Конечно, это может быть реализовано с помощью md5 + файл / db, содержащий md5. Я хочу не изобретать велосипед заново.

Ответы [ 4 ]

9 голосов
/ 16 декабря 2009

Вряд ли кто-то создал библиотеку для чего-то такого простого. Решение в 13 строк:

import pickle
import md5
try:
    l = pickle.load(open("db"))
except IOError:
    l = []
db = dict(l)
path = "/etc/hosts"
checksum = md5.md5(open(path).read())
if db.get(path, None) != checksum:
    print "file changed"
    db[path] = checksum
pickle.dump(db.items(), open("db", "w")
4 голосов
/ 04 мая 2011

FYI - для тех, кто использует этот пример, которые получили эту ошибку: «Ошибка типа: невозможно выбрать объекты HASH» Просто измените следующее (опционально обновите md5 до hashlib, md5 устарела):

    import pickle
    import hashlib #instead of md5
    try:
        l = pickle.load(open("db"))
    except IOError:
        l = []
    db = dict(l)
    path = "/etc/hosts"
    #this converts the hash to text
    checksum = hashlib.md5(open(path).read()).hexdigest() 
    if db.get(path, None) != checksum:
        print "file changed"
        db[path] = checksum
    pickle.dump(db.items(), open("db", "w"))

так что просто поменяйте:

    checksum = hashlib.md5(open(path).read())

до

    checksum = hashlib.md5(open(path).read()).hexdigest()
2 голосов
/ 16 декабря 2009

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

0 голосов
/ 16 декабря 2009

Не можем мы просто проверить дату последнего изменения. т.е. после первой операции мы сохраняем дату последнего изменения в БД, а затем перед повторным запуском сравниваем дату последнего изменения файла foo.txt со значением, хранящимся в нашей БД. если они отличаются, мы выполняем операцию снова

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...