如何向上搜索目录?我可以向上走到文件系统的根目录吗?

问题描述

我正在尝试从给定目录开始但向上而不是像os.walk中那样向下搜索特定目录。例如,此函数返回给定目录是否为Alire项目的根目录-这仅表示该目录包含alire / *。toml:

''' Check if this directory contains a 'alire/*.toml' file '''
def is_alire_root(dir):
    dir = dir / "alire"
    if dir.is_dir():
        for x in dir.iterdir():
            if x.suffixes == [".toml"]:
                return True
        return False
    else:
        return False

因此,给定一个谓词,该谓词告诉我们是否已找到所需目录,我将如何从给定路径向上搜索,例如

os_walk_upwards(os.path.abspath("."),is_alire_root)

会告诉我们当前目录或它上面的任何目录是否包含alire / *。toml?尽管os_walk_upwards可以用于各种搜索,但我专门在寻找可以作为Gnatstudio中的插件的东西。

解决方法

对于python版本> = 3.4,我们可以使用pathlib

import os.path
from pathlib import Path

def is_alire_root(dir):
    (... as above ...)

''' Search upwards from path for a directory matching the predicate '''
def os_walk_upwards(directory_predicate,path=Path(os.path.abspath("."))):
    if directory_predicate(path):
        return True
    else:
        parent = path.parent
        if parent == path:
            return False  # reached root of filesystem
        return directory_predicate(parent)

print(os_walk_upwards(is_alire_root))

但是Gnatstudio使用python 2.7.16,因此无法正常工作。而是使用:

import os.path

''' Check if this directory contains a 'alire/*.toml' file '''
def is_alire_root(dir):
    dir = os.path.join(dir,"alire")
    if os.path.isdir(dir):
        for x in os.listdir(dir):
            if os.path.splitext(x)[1] == ".toml":  # will also match e.g. *.tar.gz.toml
                return True
        return False
    else:
        return False

''' Check if this or any parent directories are alire_root directories '''
def os_walk_upwards(directory_predicate,path=os.path.abspath(".")):
    if directory_predicate(path):
        return True
    else:
        parent = os.path.dirname(path)
        if parent == path:
            return False  # reached root of filesystem
        return directory_predicate(parent)

print(os_walk_upwards(is_alire_root))

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...