在Python的子目录中列出文件 - mindepth& MAXDEPTH

时间:2015-02-20 05:50:36

标签: python os.walk

我想在根目录中打印2级内的子目录中的文件。在shell中我可以使用下面的find命令

find -mindepth 3 -type f
./one/sub1/sub2/a.txt
./one/sub1/sub2/c.txt
./one/sub1/sub2/b.txt

在python中如何实现这一目标。我知道os.walk,glob和fnmatch的基本语法。但是不知道如何指定限制(如bash中的mindepeth和maxdepth)

3 个答案:

答案 0 :(得分:5)

您可以使用.count()方法查找深度:

import os

def files(rootdir='.', mindepth=0, maxdepth=float('inf')):
    root_depth = rootdir.rstrip(os.path.sep).count(os.path.sep) - 1
    for dirpath, dirs, files in os.walk(rootdir):
        depth = dirpath.count(os.path.sep) - root_depth
        if mindepth <= depth <= maxdepth:
            for filename in files:
                yield os.path.join(dirpath, filename)
        elif depth > maxdepth:
            del dirs[:] # too deep, don't recurse

示例:

 print('\n'.join(files(mindepth=3)))

The answer to the related question uses the same technique

答案 1 :(得分:3)

您不能将此任何内容指定给os.walk。 但是,您可以编写一个能够实现您所需要的功能。

import os
def list_dir_custom(mindepth=0, maxdepth=float('inf'), starting_dir=None):
    """ Lists all files in `starting_dir` 
    starting from a `mindepth` and ranging to `maxdepth`

    If `starting_dir` is `None`, 
    the current working directory is taken.

    """
    def _list_dir_inner(current_dir, current_depth):
        if current_depth > maxdepth:
            return
        dir_list = [os.path.relpath(os.path.join(current_dir, x))
                    for x in os.listdir(current_dir)]
        for item in dir_list:
            if os.path.isdir(item):
                _list_dir_inner(item, current_depth + 1)
            elif current_depth >= mindepth:
                result_list.append(item)

    if starting_dir is None:
        starting_dir = os.getcwd()

    result_list = []
    _list_dir_inner(starting_dir, 1)
    return result_list

编辑:添加了更正,减少了不必要的变量定义。

第二次编辑:包含2Rings建议,使其列出与find完全相同的文件,即maxdepth是独占的。

第3次编辑:添加2Ring的其他评论,同时将路径更改为relpath以使用与find相同的格式返回输出。

答案 2 :(得分:-1)

这是pathlib的实现:

public static WebElement switchToIFrameWithElement(WebDriver driver, By element) {
    driver.switchTo().defaultContent();

    try {
        if (driver.findElement(element).isDisplayed()) ;
        {
            System.out.println("Element is displayed on main page");
        }
    } catch (Exception continueFlow) {
        List<WebElement> frames = driver.findElements(By.cssSelector("iframe"));
        for (WebElement frame : frames) {
            driver.switchTo().defaultContent();
            System.out.println("going back to main page");
            try {
                driver.switchTo().frame(frame);
                System.out.println("switched to next frame: " + frame);
                if (driver.findElement(element).isDisplayed()) {
                    System.out.println("element is found in frame: " + frame);
                    break;
                }
            } catch (NoSuchElementException | StaleElementReferenceException | ElementNotInteractableException ignored) {
            }
        }
    }  System.out.println("returned element succesfully");
    return driver.findElement(element);
}

样品用量:

from pathlib import Path

def get_files(path, mask, mindepth, maxdepth):
    for i in range(mindepth, maxdepth + 1):
        for f in Path(path).glob('/'.join('*' * i) + '/' + mask):
            yield f