Python 如何递归扫描目录
目录简单地定义为子目录和单个文件的集合;或者其中之一。目录层次结构是通过在主目录(也称为“根”目录)中组织所有文件和子目录来构建的。在目录层次结构中,这些子目录使用“/”运算符分隔。
由于目录以层次结构/树的形式组织,因此扫描目录可以类比于遍历树。为了做到这一点,有各种各样的方法。
- 使用os.walk()方法
-
使用glob.glob()方法
-
使用os.listdir()方法
目录由操作系统处理;因此,每当需要对任何目录进行状态更新时,都需要使用os模块。
使用os.walk()方法
os.walk()函数通过自上而下或自下而上遍历目录树,在目录树中生成文件名。它返回一个三元组,每个目录生成一个:(路径,名称和文件名)
路径是一个表示目录路径的字符串。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中递归地扫描目录。