目录:
os 模块简介 os.walk 函数的基本用法 os.walk 函数的参数详解 实际应用场景
Python的os模块简介
在开始学习 os.walk
之前,我们先来简单了解一下 os
模块。os
模块是Python标准库的一部分,它提供了与操作系统交互的功能。通过 os
模块,我们可以进行诸如创建、删除文件和目录,获取文件和目录的信息,以及执行系统命令等操作。在使用 os
模块之前,我们需要先导入它:
import os # 导入os模块
创建目录与文件,结构如下:在main.py
中写代码然后运行。
os.walk 函数的基本用法
os.walk
函数的作用是遍历指定目录及其所有子目录,返回一个三元组(根目录,子目录列表,文件列表)。它的基本语法如下:
os.walk(top, topdown=True, onerror=None, followlinks=False)
参数说明:
top
:要遍历的顶级目录的路径。topdown
:可选参数,默认为True
。如果为True
,则先遍历顶级目录,然后再递归遍历子目录;如果为False
,则先遍历子目录,然后再遍历顶级目录。onerror
:可选参数,用于指定处理错误的函数。如果在遍历过程中发生错误,会调用这个函数进行处理。followlinks
:可选参数,默认为False
。如果为True
,则会跟随符号链接遍历目录。
下面我们来看一个简单的例子,遍历当前目录及其所有子目录:
import os
# 遍历当前目录
for root, dirs, files in os.walk('.'):
# root表示当前遍历到的目录路径
print(f"当前目录: {root}")
# dirs表示当前目录下的子目录列表
print(f"子目录: {dirs}")
# files表示当前目录下的文件列表
print(f"文件: {files}")
print("-" * 50)
输出结果示例
当前目录: .
子目录: ['mo', 'shan']
文件: ['main.py']
--------------------------------------------------
当前目录: .\mo
子目录: ['ren', 'yu']
文件: []
--------------------------------------------------
当前目录: .\mo\ren
子目录: []
文件: ['test.txt']
--------------------------------------------------
当前目录: .\mo\yu
子目录: []
文件: []
--------------------------------------------------
当前目录: .\shan
子目录: []
文件: ['hai.txt']
--------------------------------------------------
在这个例子中,我们使用 os.walk('.')
遍历当前目录(.
表示当前目录)。os.walk
返回的三元组分别赋值给 root
、dirs
和 files
。然后我们通过打印这些变量,来查看遍历到的目录和文件信息。
os.walk 函数的参数详解
topdown参数
前面提到 topdown
参数决定了遍历的顺序。我们来看看 topdown=False
时的情况:
import os
# 遍历当前目录,topdown=False
for root, dirs, files in os.walk('.', topdown=False):
print(f"当前目录: {root}")
print(f"子目录: {dirs}")
print(f"文件: {files}")
print("-" * 50)
输出结果示例
当前目录: .\mo\ren
子目录: []
文件: ['test.txt']
--------------------------------------------------
当前目录: .\mo\yu
子目录: []
文件: []
--------------------------------------------------
当前目录: .\mo
子目录: ['ren', 'yu']
文件: []
--------------------------------------------------
当前目录: .\shan
子目录: []
文件: ['hai.txt']
--------------------------------------------------
当前目录: .
子目录: ['mo', 'shan']
文件: ['main.py']
--------------------------------------------------
可以看到,当 topdown=False
时,先遍历了子目录 ./mo/ren
,然后再遍历顶级目录。
onerror参数onerror
参数用于指定处理错误的函数。我们可以定义一个简单的错误处理函数,来看看它的用法:
import os
def error_handler(err):
print(f"发生错误: {err}")
# 遍历目录,指定错误处理函数
for root, dirs, files in os.walk('.', onerror=error_handler):
print(f"当前目录: {root}")
print(f"子目录: {dirs}")
print(f"文件: {files}")
print("-" * 50)
followlinks参数followlinks
参数用于决定是否跟随符号链接遍历目录。在Windows系统上,符号链接的使用相对较少,在Linux和macOS系统上更为常见。下面是一个简单的示例,假设我们有一个符号链接指向一个目录:
import os
# 假设我们有一个符号链接指向某个目录
# 这里只是示例,实际运行时需要确保有这样一个符号链接
for root, dirs, files in os.walk('.', followlinks=True):
print(f"当前目录: {root}")
print(f"子目录: {dirs}")
print(f"文件: {files}")
print("-" * 50)
os.walk 函数的实际应用场景
1、文件搜索
假设我们要在一个目录及其所有子目录中搜索特定类型的文件,比如所有的 .txt
文件。我们可以使用 os.walk
来实现:
import os
# 存储找到的txt文件路径
txt_files = []
# 遍历目录
for root, dirs, files in os.walk('.'):
for file in files:
if file.endswith('.txt'):
txt_files.append(os.path.join(root, file))
# 打印找到的txt文件路径
for txt_file in txt_files:
print(txt_file)
输出结果示例
.\mo\ren\test.txt
.\shan\hai.txt
2、计算目录大小
有时候我们需要计算一个目录及其所有子目录的总大小。我们可以通过 os.walk
遍历所有文件,然后获取每个文件的大小并累加:
import os
# 初始化目录大小
total_size = 0
# 遍历目录
for root, dirs, files in os.walk('.'):
for file in files:
file_path = os.path.join(root, file)
total_size += os.path.getsize(file_path)
print(f"目录总大小: {total_size} 字节")
输出结果示例
目录总大小: 280 字节
3、备份目录
我们可以使用 os.walk
遍历一个目录及其所有子目录,然后将文件复制到另一个目录进行备份。下面是一个简单的示例,使用 shutil
模块来进行文件复制:
import os
import shutil
# 源目录
source_dir = 'mo'
# 目标目录
target_dir = 'backup'
# 创建目标目录
ifnot os.path.exists(target_dir):
os.makedirs(target_dir)
# 遍历源目录
for root, dirs, files in os.walk(source_dir):
for dir in dirs:
source_sub_dir = os.path.join(root, dir)
target_sub_dir = os.path.join(target_dir, os.path.relpath(source_sub_dir, source_dir))
ifnot os.path.exists(target_sub_dir):
os.makedirs(target_sub_dir)
for file in files:
source_file = os.path.join(root, file)
target_file = os.path.join(target_dir, os.path.relpath(source_file, source_dir))
shutil.copy2(source_file, target_file)
print("备份完成")
可见mo
目录下的文件夹和文件都备份到了backup
目录中。