python - 递归地比较两个目录并标记等效结构

时间:2012-10-23 17:48:43

标签: python performance recursion

我在stackoverflow中读过许多与python比较目录相关的问题。但是,我目前的问题有点不同 我有两个目录,其中包含两个不同的版本发布包内容。现在我想比较以确保内容相同。 少数文件中嵌入了版本名称。现在哪种方法可以比较它们并得出结论(版本差异除外,所有文件都匹配)。


例如:
版本 V1R1C1 包含目录结构,如下所示

pmt> find . -name "*"
.
./c1
./c1/c2
./c1/c1_V1R1C1.cfg
./a1
./a1/a1_V1R1C1.cfg
./a1/a2
./a1/a2/a1a2_V1R1C1.cfg
./b1/a_best_file.txt
./b1/b2/a_test_file.txt
./b1/b2/b1b2_V1R1C1.cfg
./a_V1R1C1.cfg

版本 V2R3C1 可能包含以下结构

pmt> find . -name "*"
.
./c1
./c1/c2
./c1/c1_V2R3C1.cfg
./a1
./a1/a1_V2R3C1.cfg
./a1/a2
./a1/a2/a1a2_V2R3C1.cfg
./b1/a_best_file.txt
./b1/b2/a_test_file.txt
./b1/b2/b1b2_V2R3C1.cfg
./a_V2R3C1.cfg

在上述情况下,程序必须将其标记为等效结构。

我可以想到几个解决方案 - 例如,将目录结构递归地读入缓存(dict),翻录版本信息并进行比较等等。但由于两个原因看起来不是一个完全有效的机制1.它确实不使用内置目录比较2.多次读取/ rip / compare绑定成本(特别是对于巨大的目录树结构)。

我正在寻找比上述简单而有效的想法。


PS:
1.如果有任何差异(除了与上例不同的版本),我想使用左/右等来获得差异列表。
2.我们可以事先假设两个目录中的版本名称(如第一种情况下为V1R1C1,第二种情况下为V2R3C1)。

2 个答案:

答案 0 :(得分:2)

glob模块有一个迭代器函数(与列表生成相比),你可以在light for循环中使用它迭代每个文件条目,然后将差异踢到一个单独的列表/字典。

这样你就不会生成大量的文件名然后通过它们进行挑选。

http://docs.python.org/py3k/library/glob.html#module-glob

答案 1 :(得分:2)

如何使用set compare?

set((remove_version(filepath) for filepath in iter_file(dic1))) == set((remove_version(filepath) for filepath in iter_file(dic2)))