如何在 Python 中递归扫描目录?


目录简单地定义为子目录和单个文件的集合;或两者之一。目录层次结构是通过将所有文件和子目录组织在一个主目录(也称为“根”目录)中构建的。这些子目录在目录层次结构中使用“/”运算符分隔。

由于目录以层次结构/树的形式组织,因此扫描它可以比作遍历树。要做到这一点,有各种方法。

  • 使用 os.walk() 方法

  • 使用 glob.glob() 方法

  • 使用 os.listdir() 方法

目录由操作系统处理;因此,每当需要任何目录的状态更新时,都需要使用 os 模块来完成。

使用 os.walk() 方法

os.walk() 函数通过自上而下或自下而上遍历目录树来生成目录树中的文件名。它为根目录为 top 的树中的每个目录返回一个三元组:(路径、名称和文件名)

path 是一个字符串,表示目录的路径。names 变量包含 path 中不以 '.' 或 '..' 开头的子目录名称列表。filenames 变量包含 path 中非目录文件的名称列表。

示例

在这里,让我们使用 os.walk() 方法显示当前根目录中存在的所有文件和子目录。

import os
path = "."
for root, d_names, f_names in os.walk(path):
   print(root, d_names, f_names)

输出

让我们编译并运行上面的程序,以产生以下结果 -

. [] ['main.py']

示例

我们还可以为每个文件创建一个完整路径。为此,我们必须使用 os.path.join() 方法。此方法将为文件创建路径。每个文件的这些路径可以使用 append() 方法连接在一起,如下所示。

import os
path = "./TEST"
fname = []
for root,d_names,f_names in os.walk(path):
   for f in f_names:
      fname.append(os.path.join(root, f))
print("fname = %s" %fname)

输出

上面程序的输出如下所示 -

fname = []

示例

使用 os.walk() 方法,我们还可以选择显示要打印的返回值元组的哪个元素。让我们看下面的示例程序。

import os
for dirpath, dirs, files in os.walk("."):
   print(dirpath) # prints paths of all subdirectories present

for dirpath, dirs, files in os.walk("."):
   print(dirs) # prints the names of existing subdirectories

for dirpath, dirs, files in os.walk("."):
   print(files) # prints existing files in the current directory

输出

上面程序的输出如下所示 -

.
[]
['main.py']

使用 glob.glob() 方法

glob 模块用于获取特定目录中与特定模式匹配的文件名。glob.glob() 方法用于搜索所有包含给定路径规范作为参数的文件名。

如果路径规范作为“*”(星号)传递,则该方法匹配路径名中的零个或多个字符;因此,它返回目录中存在的所有文件。

示例

让我们尝试使用 glob() 方法打印根目录中存在的所有文件和子目录的名称。示例如下所示。

from pathlib import Path

root_directory = Path('.')
size = 0
for f in root_directory.glob("*"):
   print(f)

输出

main.py

结论

我们讨论了如何使用 os.walk() 函数在 Python 中递归扫描目录。

更新于: 2023年2月24日

12K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告