Python库检测文件在不同运行间是否变化?
假设我有一个程序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"))