如何在Python中迭代给定目录下的文件?


迭代给定目录中的文件对于执行诸如查找符合特定条件的文件或统计目录中文件数量之类的操作非常有用。Python 提供以下五种方法来遍历目录中所有现有文件

  • os.listdir() 方法

  • os.walk() 方法

  • os.scandir() 方法

  • 使用 pathlib 模块

  • glob.iglob() 方法

让我们详细了解这些方法。

使用 os.listdir() 方法

os.listdir() 方法用于列出目录中存在的所有文件。它接受目录的路径作为参数,并返回所有条目(除了“.”和“..”之类的特殊条目)作为列表。

以下是此方法的语法:

os.listdir(path)

示例

在以下示例中,我们尝试使用 for 循环列出当前目录中存在的所有文件。

import os, sys

path = "."
dir = os.listdir( path )

for file in dir:
   print(file)

输出

输出显示如下

main.py

使用 os.walk() 方法

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

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']

使用 os.listdir() 方法

os.listdir(my_path) 方法将获取 my_path 目录中存在的所有内容,包括文件和子目录。即使没有循环语句,也可以使用此方法列出目录中存在的所有文件和子目录。但是,要迭代这些文件,必须使用循环语句。

示例

在以下示例中,我们将尝试在循环语句中使用 os.listdir() 方法来迭代目录中存在的所有文件。

import os
path = "."

for file_names in os.listdir(path):
   print(file_names)

输出

main.py

使用 pathlib 模块

pathlib 模块提供表示文件系统路径的类。它类似于 path 模块,但 path 模块创建字符串来表示文件路径,而 pathlib 模块创建对象。在此模块中,我们使用 glob() 方法列出目录中存在的文件和子目录。

glob() 方法接受模式作为参数,并将此模式与目录中存在的文件匹配。如果文件被认为与模式匹配,则将其返回。如果要返回目录中的所有文件,请将星号 (*) 作为参数传递。

示例

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

from pathlib import Path

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

输出

main.py

使用 glob 模块

python 中的 glob 模块用于搜索目录中的文件。它使用模式并将其与目录中存在的文件匹配。如果文件被认为与模式匹配,则列出它们。

此模块通常使用 iglob() 方法递归搜索文件。与 glob() 方法一样,它也接受模式作为参数,并将此模式与目录中存在的文件匹配。如果文件被认为与模式匹配,则将其返回。如果要返回目录中的所有文件,请将星号 (*) 作为参数传递。

示例

在此示例中,我们尝试列出当前目录中的所有文件。在这里,由于我们列出所有文件和子目录,因此我们将星号 (*) 作为模式传递。

import glob

pattern = "*"
for f in glob.iglob(pattern):
   print(f)

输出

结果如下所示:

main.py

更新于:2023年4月19日

浏览量 10K+

启动你的职业生涯

完成课程后获得认证

开始学习
广告