快速检查列表中的子目录

时间:2018-05-17 21:16:18

标签: python python-3.5 python-3.6 os.path pathlib

我有两组路径,第一组可能有5000个文件,第二组可能有10000个文件。第一组包含在第二组中。我需要检查第二组中的任何条目是否是第一组中任何条目的子项(即,它是否是第一组中另一个目录中的子目录或文件)。还有一些额外的要求:

  • 文件系统上没有任何操作,只应在路径字符串上进行操作(除非在需要时处理符号链接)。
  • 独立于平台(例如大写/小写,不同的分隔符)
  • 对于表达相同路径的不同方式,它应该是健壮的。
  • 它应该处理符号链接及其目标。
  • 有些路径是绝对的,有些是相对的。
  • 这应该尽可能快!

我正在考虑为每个条目获取os.path.abspath()os.path.realpath(),然后将它们与os.path.commonpath([parent]) == os.path.commonpath([parent, child])进行比较。我无法想出一个快速运行的好方法。或者直接比较字符串是否安全?这会让事情变得容易多了。谢谢!

编辑:我对平台独立性有点不清楚。它应该适用于所有平台,但不会有例如Windows和Unix风格的路径混合。

1 个答案:

答案 0 :(得分:0)

您可以先使用os.path.realpath计算所有路径的实际路径,然后使用os.path.commonprefix检查第一组路径的子路径中是否有一条路径。

示例:

import os

first = ['a', 'b/x', '/r/c']
second = ['e', 'b/x/t', 'f']

first = set(os.path.realpath(p) for p in first)
second = set(os.path.realpath(p) for p in second)

for s in second:
    if any(os.path.commonprefix([s, f]) == f
           for f in first):
        print(s)

你得到:

/full/path/to/b/x/t