最快的Python方式来比较两个目录并删除非重复的基本名称

时间:2018-05-29 18:34:12

标签: python-3.x algorithm performance string-comparison shutil

我有两个目录,一个名为images,另一个名为annotations。在images目录中,我有长字符串名称和.jpg文件扩展名的图像。在annotations目录中,我有.xml个具有相同字符串名称的文件(直到扩展名)。

我删除了一堆xml文件(200k中大约20k),但我仍然拥有所有200k图像。现在我想删除不再具有相应xml文件的图像文件。我可以通过对每个目录进行通配并比较每个文件列表中的每一对来轻松完成此操作,但这需要相当长的时间才能运行。有没有更快的方法来解决这个问题?

那么换句话说,在python中比较列表A和子列表B的最快方法是什么,然后从A返回所有非匹配?

1 个答案:

答案 0 :(得分:3)

我会使用pathlib库和set数据结构,如下所示。

from pathlib import Path
keep_stems = set(p.stem for p in Path('images').glob('*.jpg'))
delete_paths = [p for p in Path('annotations').glob('*.xml') if p.stem not in keep_stems]
for p in delete_paths:
    p.unlink()

从技术上讲,你可以在列表理解中取消链接,但是从列表理解中产生副作用似乎很不愉快。