簡體   English   中英

在Python子目錄中列出文件-Mindepth和Maxdepth

[英]List files in a subdirectory in Python - mindepth & maxdepth

我想在子目錄中打印文件,該子目錄是根目錄中的2級。 在外殼中,我可以使用以下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)

您可以使用.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)))

有關問題的答案使用相同的技術

你不能指定任何這個到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相同的格式返回輸出。

這是pathlib的實現:

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

樣品用法:

for i in get_files('testdir', '*.txt', 1, 2):
    print(i)
>>>
testdir/a/a.txt
testdir/b/b.txt
testdir/c/c.txt
testdir/a/aa/aa.txt
testdir/b/bb/bb.txt
testdir/c/cc/cc.txt

for i in get_files('testdir', '*.txt', 2, 3):
    print(i)
>>>
testdir/a/aa/aa.txt
testdir/b/bb/bb.txt
testdir/c/cc/cc.txt
testdir/a/aa/aaa/aaa.txt
testdir/b/bb/bbb/bbb.txt
testdir/c/cc/ccc/ccc.txt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM