我有一些(大)文件,仅当它们已更改时才要在给定的站点上载。为此,我计划在Python(3)
作为编程语言的情况下使用以下方案:
hashlib
模块,我创建了一个字典,其中包括:
hash_file.txt
)。hashlib
,我用以下方法创建了一个(新的)字典:
hash_file.txt
中的旧词典进行了比较,并上传了哈希不匹配的文件(对应于值不匹配的键)。hash_file.txt
中的旧字典替换为新字典。带有以下新旧字典:
{"file_1":"foo1","file_2":"foo2","file_3":"foo3","file_4":"foo4"}
,{"file_1":"foo1","file_2":"bar2","file_3":"foo3","file_4":"bar4"}
,要检测的键将是"file_2"
和"file_4"
。
答案 0 :(得分:2)
假设您不在乎一个字典中存在的键,而不关心另一个字典中存在的键,则可以执行以下操作:
d1 = {"file_1":"foo1","file_2":"foo2","file_3":"foo3","file_4":"foo4"}
d2 = {"file_1":"foo1","file_2":"bar2","file_3":"foo3","file_4":"bar4"}
non_matching = []
for k, v1 in d1.items():
v2 = d2.get(k, v1)
if v1 != v2:
non_matching.append(k)
non_matching
然后根据需要成为['file_2', 'file_4']
。
如果要做关心可能在一个而不是另一个中的键,我们需要考虑两个字典中键的并集。可以这样完成:
d1 = {"file_1":"foo1","file_2":"foo2","file_4":"foo4"}
d2 = {"file_1":"foo1","file_2":"bar2","file_3":"foo3"}
non_matching = []
shared_keys = set(d1.keys()).union(d2.keys())
for k in shared_keys:
if d1.get(k, []) != d2.get(k, ()):
non_matching.append(k)
这将使您['file_2', 'file_3', 'file_4']