我想在根目录中打印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)
答案 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)))
答案 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