Python 遍历目录
一、引言
在 Python 编程中,经常需要遍历目录以查找、读取或操作文件。遍历目录可以帮助我们管理文件系统,查找特定文件或执行批量任务。下面将介绍几种在 Python 中遍历目录的方法。
二、遍历目录的方法
1. 使用 os 模块
Python 的 os 模块提供了很多与操作系统交互的函数,其中 os.listdir() 和 os.walk() 是遍历目录的常用函数。
Python 目录遍历常用 os、pathlib 和 glob 模块。os.walk 支持递归遍历,os.listdir 仅列当前层。pathlib 提供面向对象路径处理,适合 Python 3.4+。glob 支持通配符匹配文件名。选择方法需考虑递归需求、路径处理便利性、文件匹配模式及版本兼容性。示例展示了使用 os.walk 统计特定文件总大小的实现。

在 Python 编程中,经常需要遍历目录以查找、读取或操作文件。遍历目录可以帮助我们管理文件系统,查找特定文件或执行批量任务。下面将介绍几种在 Python 中遍历目录的方法。
Python 的 os 模块提供了很多与操作系统交互的函数,其中 os.listdir() 和 os.walk() 是遍历目录的常用函数。
os.listdir() 函数可以列出指定目录下的所有文件和子目录。但需要注意的是,它只能列出指定目录下的直接内容,而不能递归地列出子目录中的文件。
import os
def list_files_in_dir(directory):
for filename in os.listdir(directory):
print(filename)
# 使用方法
list_files_in_dir('/path/to/your/directory')
os.walk() 函数可以递归地遍历目录树,返回目录中的文件名和子目录名。它是一个生成器,每次调用会返回一个三元组,包含当前目录名、当前目录下的子目录名列表和当前目录下的非目录文件名列表。
import os
def traverse_directory(directory):
for root, dirs, files in os.walk(directory):
for name in files:
print(os.path.join(root, name))
for name in dirs:
print(os.path.join(root, name))
# 使用方法
traverse_directory('/path/to/your/directory')
Python 3.4 引入了 pathlib 模块,它提供了一种面向对象的方式来处理文件系统路径。pathlib 模块中的 Path 类提供了很多实用的方法,包括遍历目录。
from pathlib import Path
def traverse_directory_with_pathlib(directory):
p = Path(directory)
for subpath in p.iterdir():
if subpath.is_file():
print(subpath)
elif subpath.is_dir():
print(subpath)
# 如果需要递归遍历子目录,可以在这里调用 traverse_directory_with_pathlib(subpath)
# 使用方法
traverse_directory_with_pathlib(Path('/path/to/your/directory'))
注意,上面的 traverse_directory_with_pathlib 函数并没有递归地遍历子目录。如果需要递归遍历,可以在 elif 语句中添加递归调用。
glob 模块提供了在目录中使用通配符搜索创建文件列表的函数。虽然它主要用于匹配文件名,但也可以用来遍历目录。
import glob
def list_files_with_glob(directory, pattern='*'):
for filepath in glob.glob(os.path.join(directory, pattern)):
print(filepath)
# 使用方法,搜索指定目录下的所有.txt 文件
list_files_with_glob('/path/to/your/directory', '*.txt')
在选择遍历目录的方法时,我们需要考虑一些因素,以确保我们选择的方法能满足我们的具体需求。
如果我们需要递归地遍历子目录中的文件,那么 os.walk() 和递归使用 pathlib.Path.iterdir() 是更好的选择。而 os.listdir() 和 glob.glob() 则只能列出指定目录下的直接内容。
pathlib 模块提供了更直观和易用的路径处理方法。使用 Path 对象,我们可以更容易地进行路径拼接、判断文件类型等操作。而 os 模块和 glob 模块则需要我们手动处理路径字符串。
如果我们需要根据特定的文件名模式来搜索文件,那么 glob 模块是最佳选择。它允许我们使用通配符来匹配文件名。
如果你的代码需要在 Python 2.x 环境中运行,那么你需要使用 os 模块或 glob 模块,因为 pathlib 模块是在 Python 3.4 中引入的。
对于大型目录树,遍历目录可能会消耗大量时间和内存。在这种情况下,你可能需要选择性能更好的方法,或者考虑使用多线程/多进程来加速遍历过程。
假设我们需要在一个大型目录树中查找所有以.txt 结尾的文件,并统计它们的总大小。我们可以使用 os.walk() 和 os.path.getsize() 来实现这个功能。
import os
def find_and_process_txt_files(directory):
total_size = 0
for root, dirs, files in os.walk(directory):
for name in files:
if name.endswith('.txt'):
filepath = os.path.join(root, name)
total_size += os.path.getsize(filepath)
return total_size
# 使用方法
total_size = find_and_process_txt_files('/path/to/your/directory')
print(f'Total size of .txt files: {total_size} bytes')
在这个示例中,我们使用 os.walk() 递归地遍历目录树,并使用 os.path.join() 来构建文件的完整路径。然后,我们检查文件名是否以.txt 结尾,如果是,则使用 os.path.getsize() 获取文件大小并将其累加到总和中。最后,我们返回总大小并打印出来。
在 Python 中遍历目录是一个常见的任务,有多种方法可以实现。选择哪种方法取决于你的具体需求,包括是否需要递归遍历、如何处理路径、是否需要匹配文件名等。os、pathlib 和 glob 模块都提供了遍历目录的功能,并且各有优势。在实际编程中,你可以根据具体情况选择最适合你的方法。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online