Python os 模块的 os.walk 函数

文摘   科技   2025-01-10 09:09   上海  
点击蓝字,关注山海摸鱼人

目录:

  1. os 模块简介
  2. os.walk 函数的基本用法
  3. os.walk 函数的参数详解
  4. 实际应用场景

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 返回的三元组分别赋值给 rootdirs 和 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目录中。

山海摸鱼人
致力于记录美好之瞬间,追寻美好之明天。
 最新文章