如何在 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 中递归扫描目录。