Python:如何识别路径是否在另一条路径中?

时间:2014-09-14 17:46:53

标签: python path

我需要知道pathA是pathB的子集,还是包含在pathB中。

我制作了一个小脚本,可以移动一些旧卷并查找重复文件。我的一般方法(即使它是一个糟糕的方法,效率低下,它只适合我而且它有效,所以我对它的蛮力很好)一直:

  1. 将所有文件映射到日志
  2. 为日志中的所有文件创建哈希
  3. 对重复项的哈希列表进行排序
  4. 在删除之前将副本移到某处进行检查
  5. 我希望能够排除某些目录(即系统文件)。这就是我写的:

    #self.search_dir =  top level directory to be searched for duplicates
    #self.mfl        =  master_file_list, being built by this func, a list of all files in search_dir
    #self.no_crawl_list   =  list of files and directories to be excluded from the search
    def build_master_file_list(self):
            for root, directories, files in os.walk(self.search_dir):
                files = [f for f in files if not f[0] == '.']
                directories[:] = [d for d in directories if not d[0] == '.']
                for filename in files:
                    filepath = os.path.join(root, filename)
                    if [root, filepath] in self.no_crawl_list:
                        pass
                    else:
                        self.mfl.write(filepath + "\n")
            self.mfl.close()
    

    但我很确定这不会按照我的意图行事。我的目标是将所有子目录排除在self.no_crawl_list之外,以便:

    如果  /path/to/excluded_dir已添加self.no_crawl_list

    然后是/path/to/excluded_dir/sub_dir/implicitly_excluded_file.txt

    之类的路径

    也会被跳过。我认为我的代码目前完全是关于要跳过的内容。然而,如果没有对路径部分进行爆炸并将它们与self.no_crawl_list中的每个可能组合进行比较,我就不知道如何做到这一点。 ' Lil帮忙? :)

1 个答案:

答案 0 :(得分:1)

根据Lukas Graf在上述评论中的帮助,我能够构建它,它就像一个魅力:

def is_subpath(self, path, of_paths):
        if isinstance(of_paths, basestring): of_paths = [of_paths]
        abs_of_paths = [os.path.abspath(of_path) for of_path in of_paths]
        return any(os.path.abspath(path).startswith(subpath) for subpath in abs_of_paths)

此外,目前这并不考虑符号链接并假定是UNIX文件系统,请参阅原始问题中的注释以获取有关扩展此问题的建议。