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

Fastest Python way to compare two dirs and delete non-duplicate basenames

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

我删除了一堆 xml 文件(200k 中大约有 20k),但我仍然有所有 200k 图片。现在我想删除不再具有相应 xml 文件的图像文件。我可以通过遍历每个目录并比较每个文件列表中的每一对来轻松地做到这一点,但这将花费相当多的时间 运行。有没有更快的方法来解决这个问题?

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

我会按如下方式使用 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()

从技术上讲,您可以在列表理解中执行取消链接,但列表理解的副作用似乎令人不快。