如何在 Python 中使用 os.walk 获取特定文件或目录列表?

Posted

技术标签:

【中文标题】如何在 Python 中使用 os.walk 获取特定文件或目录列表?【英文标题】:How to fetch a specific file or directory list using os.walk in Python? 【发布时间】:2013-02-13 22:58:39 【问题描述】:

我想知道是否可以通过索引号检索 os.walk 类中特定子文件夹中的特定文件。

我还想知道如何仅列出 os.walk 中特定级别的子目录,例如仅列出根目录的子目录。我可以列出所有子目录,我可以看到第一级子目录的列表首先组合在一起,但是我找不到不使用循环来过滤掉这些子目录的方法......

这样的东西部分有效(改编自另一个问题),但我不知道如何从一个级别过滤文件夹:

dirs[:] = [d for d in dirs if re.match('anyname_\d3', d, flags=0)]

使用 type 命令时 os.walk 元组显示为“列表”,尝试使用索引号时出现的一些错误指的是字典对象的不当使用。我很困惑。

谢谢!

【问题讨论】:

也许您只是在寻找 os.listdir('/path/to/dir') 而不是 os.walk...? 【参考方案1】:

尚不完全清楚您想要做什么,但我可以提供一个示例(我认为)做了足够多的事情,您可以弄清楚如何做您想做的事情:打印每个名为的目录中第三个文件的路径名"anyname" 正好比顶部低两层:

for dirpath, dirnames, filenames in os.walk(top):
    depth = os.path.relpath(dirpath, top).count(os.pathsep)
    if depth == 2 and os.path.basename(dirpath) == "anyname":
        print(os.path.join(dirpath, filenames[2]))

您可以通过修剪 walk 甚至不查看超过 2 层的目录来提高效率:

for dirpath, dirnames, filenames in os.walk(top):
    depth = os.path.relpath(dirpath, top).count(os.pathsep)
    if depth == 2:
        if os.path.basename(dirpath) == "anyname":
            print(os.path.join(dirpath, filenames[2]))
        dirnames.clear()

或者,更有效但更复杂一点的是,修剪所有未命名为“anyname”的深度 2 目录:

for dirpath, dirnames, filenames in os.walk(top):
    depth = os.path.relpath(dirpath, top).count(os.pathsep)
    if depth == 1:
        dirnames[:] = ["anyname"] if "anyname" in dirnames else []
    elif depth == 2:
        print(os.path.join(dirpath, filenames[2]))
        dirnames.clear()

【讨论】:

以上是关于如何在 Python 中使用 os.walk 获取特定文件或目录列表?的主要内容,如果未能解决你的问题,请参考以下文章

Python3.x:os.listdir和os.walk(获取路径方法)的区别

如何获取目录下的文件数(一行Python)

python使用os.listdir和os.walk获得文件的路径

如何使用 os.walk 或 glob.glob 获取目录中所有类型的文件扩展名

python os.walk()代码详解

python笔记4-遍历文件夹目录os.walk()