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 下返回一个由三个元素组成的元组:(路径、目录名和文件名)
路径是表示目录路径的字符串。names 变量包含路径中的子目录名列表,不包括以 ‘.’ 或 ‘..’ 开头的目录名。filenames 变量包含路径中非目录文件的名称列表。
示例
在以下示例中,我们将在循环语句中使用 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()方法接受一个模式作为参数,并将此模式与目录中存在的文件进行匹配。如果文件被视为与模式匹配,则返回该文件。如果你想返回目录中的所有文件,请将Asterisk(*)作为参数传递。
示例
让我们尝试使用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