【问题标题】:Fastest Python way to compare two dirs and delete non-duplicate basenames比较两个目录和删除非重复基名的最快 Python 方法
【发布时间】:2018-11-08 11:47:46
【问题描述】:

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

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

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

【问题讨论】:

  • 文件名有什么结构吗?

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


【解决方案1】:

我将使用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()

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

【讨论】:

  • 是的,我应该早点意识到要使用集合,谢谢
  • 这是倒退的,但假设图像是注释的子集。感谢您也使用 pathlib,请切换到此而不是 os/glob
  • 哦,我的错,但很高兴它有所帮助。
猜你喜欢
  • 2011-03-13
  • 2016-11-12
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 2019-09-06
  • 2013-06-18
  • 2015-07-04
  • 2015-12-18
相关资源
最近更新 更多