Python库检测文件在不同运行间是否变化?

10 投票
4 回答
12801 浏览
提问于 2025-04-15 17:04

假设我有一个程序A。我运行它,它会从一个文件foo.txt开始执行一些操作。现在程序A结束了。

接下来我再次运行程序A。它会检查文件foo.txt是否有变化。如果文件有变化,程序A会再次执行它的操作,否则,它就会退出。

有没有现成的库函数或者外部库可以实现这个功能呢?

当然可以用md5加上一个包含md5的文件或数据库来实现。我想避免重复造轮子。

4 个回答

2

这件事其实很简单,自己动手做也很容易。不过因为它跟具体的应用关系很大,所以没必要专门搞一个库来处理。如果真要做一个这样的库,它可能会变得非常复杂,因为要适应各种不同的需求。这样一来,学习和使用这个库的时间,可能跟自己手动实现一遍差不多。

7

给大家一个小提示 - 如果你在使用这个例子时遇到了这个错误:“TypeError: can't pickle HASH objects”,那么你可以简单地做以下修改(建议把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()
10

不太可能有人会为这么简单的事情专门做一个库。这里有一个13行的解决方案:

import pickle
import hashlib
try:
    l = pickle.load(open("db"))
except IOError:
    l = []
db = dict(l)
path = "/etc/hosts"
checksum = hashlib.md5(open(path).read().encode())
if db.get(path, None) != checksum:
    print("file changed")
    db[path] = checksum
pickle.dump(db.items(), open("db", "w"))

撰写回答