[英]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.