首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何判断一个路径是否是另一个路径的子目录?

如何判断一个路径是否是另一个路径的子目录?
EN

Stack Overflow用户
提问于 2012-01-14 01:08:29
回答 5查看 6K关注 0票数 6

我得到了一个路径列表,我需要在其中检查文件。当然,如果给我一个根目录和一个子目录,就不需要处理子目录了。例如

代码语言:javascript
复制
c:\test  // process this
c:\test\pics // do not process this
c:\test2 // process this

如何(跨平台)判断一个路径不是另一个路径的子目录。我希望这是跨平台的,只要它们不是周期性的,我就不会担心符号链接(更糟糕的情况是,我最终处理了两次数据)。

更新:这是我最终使用的代码,感谢@F.J

代码语言:javascript
复制
   def unique_path_roots(paths):
    visited = set()
    paths = list(set(paths))

    for path in sorted(paths,key=cmp_to_key(locale.strcoll)):
        path = normcase(normpath(realpath(path)))

        head, tail = os.path.split(path)
        while head and tail:
            if head in visited:
                break
            head, tail = os.path.split(head)
        else:
            yield path
            visited.add(path)
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-01-14 01:18:24

我将维护一组您已经处理过的目录,然后对于每个新路径,在处理之前检查它的父目录是否已经存在于该集中:

代码语言:javascript
复制
import os.path

visited = set()
for path in path_list:
    head, tail = os.path.split(path)
    while head and tail:
        if head in visited:
            break
        head, tail = os.path.split(head)
    else:
        process(path)
        visited.add(path)

请注意,应该对path_list进行排序,以便子目录始终位于其父目录之后。

票数 7
EN

Stack Overflow用户

发布于 2013-08-08 07:51:22

代码语言:javascript
复制
def is_subdir(path, directory):
    path = os.path.realpath(path)
    directory = os.path.realpath(directory)

    relative = os.path.relpath(path, directory)

    if relative.startswith(os.pardir):
        return False
    else:
        return True
票数 8
EN

Stack Overflow用户

发布于 2012-01-14 01:23:22

跟踪您已经处理过的目录(以标准化的形式),如果您已经看到它们,就不要再处理它们。像这样的东西应该是有效的:

代码语言:javascript
复制
from os.path import realpath, normcase, sep

dirs = [r"C:\test", r"C:\test\pics", r"C:\test2"]

processed = []

for dir in dirs:
    dir = normcase(realpath(dir)) + sep
    if not any(dir.startswith(p) for p in processed):
        processed.append(dir)
        process(dir)            # your code here
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8854421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档