Python中os.walk用法详解

os.walk() 是 Python 中用于遍历目录树的强大函数。让我详细解释每个变量返回的信息和用法:

基本概念

  • root: 当前正在访问的目录路径
  • dirs: 当前目录下的子目录列表
  • files: 当前目录下的文件列表

示例目录结构

复制代码
project/
├── log_2024_01.txt
├── config.ini
├── logs/
│   ├── system.log
│   ├── app.log
│   └── archive/
│       └── old_log.txt
└── data/
    ├── input.csv
    └── output.csv

具体例子

python 复制代码
import os

# 假设当前目录结构如上所示
log_dir_path = "./project"

for root, dirs, files in os.walk(log_dir_path):
    print(f"当前目录: {root}")
    print(f"子目录列表: {dirs}")
    print(f"文件列表: {files}")
    print("-" * 50)

第一次迭代

复制代码
当前目录: ./project
子目录列表: ['logs', 'data']  # 当前目录下的子文件夹
文件列表: ['log_2024_01.txt', 'config.ini']  # 当前目录下的文件

第二次迭代

复制代码
当前目录: ./project/logs
子目录列表: ['archive']  # logs文件夹下的子目录
文件列表: ['system.log', 'app.log']  # logs文件夹下的文件

第三次迭代

复制代码
当前目录: ./project/logs/archive
子目录列表: []  # 没有子目录
文件列表: ['old_log.txt']  # archive文件夹下的文件

第四次迭代

复制代码
当前目录: ./project/data
子目录列表: []  # 没有子目录
文件列表: ['input.csv', 'output.csv']  # data文件夹下的文件

实际应用示例

1. 查找特定文件

python 复制代码
import os

for root, dirs, files in os.walk("."):
    for file in files:
        if file.endswith(".log"):
            full_path = os.path.join(root, file)
            print(f"找到日志文件: {full_path}")

2. 计算目录大小

python 复制代码
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} 字节")

3. 遍历时排除特定目录

python 复制代码
import os

exclude_dirs = ['.git', '__pycache__', 'node_modules']

for root, dirs, files in os.walk("."):
    # 从 dirs 列表中移除要排除的目录
    dirs[:] = [d for d in dirs if d not in exclude_dirs]
    
    for file in files:
        print(os.path.join(root, file))

4. 获取所有文件的完整路径

python 复制代码
import os

all_files = []
for root, dirs, files in os.walk("/path/to/directory"):
    for file in files:
        full_path = os.path.join(root, file)
        all_files.append(full_path)

print(f"找到 {len(all_files)} 个文件")

重要特性

  1. 默认是深度优先遍历(从上到下)

  2. 可以控制遍历方向

    python 复制代码
    # 自顶向下遍历(默认)
    for root, dirs, files in os.walk(".", topdown=True):
        pass
    
    # 自底向上遍历
    for root, dirs, files in os.walk(".", topdown=False):
        pass
  3. 修改 dirs 会影响遍历

    python 复制代码
    for root, dirs, files in os.walk("."):
        # 不遍历隐藏目录
        dirs[:] = [d for d in dirs if not d.startswith('.')]

实际使用技巧

python 复制代码
import os

class LogProcessor:
    def __init__(self, log_dir_path):
        self.log_dir_path = log_dir_path
    
    def process_logs(self):
        for root, dirs, files in os.walk(self.log_dir_path):
            # 按日期处理日志
            for file in files:
                if file.endswith('.log'):
                    self._process_single_log(root, file)
    
    def _process_single_log(self, directory, filename):
        filepath = os.path.join(directory, filename)
        # 处理日志文件的逻辑
        print(f"处理: {filepath}")

# 使用示例
processor = LogProcessor("./logs")
processor.process_logs()

os.walk() 是一个非常实用的函数,特别适合需要递归处理文件系统的场景,比如日志分析、文件备份、批量重命名等任务。


相关推荐
触底反弹1 小时前
面试被问到 Text2SQL,我用 DeepSeek 自己实现了一个
python·sqlite
2601_962295581 小时前
python+selenium实现自动化测试
自动化测试·python·selenium·学习心得·web端测试
青 春 记 忆1 小时前
零基础入门python66:FastAPI AI标题、摘要和标签
python·fastapi·后端开发
qq_22589174661 小时前
基于Python+Django的LangGraph智能旅游规划系统
python·django·旅游
青 春 记 忆2 小时前
零基础入门python65:FastAPI 安全调用大模型API
python·fastapi·后端开发
维克兜率天3 小时前
【维克】特征归一化与标准化:为什么模型对数据的“尺度“很敏感?
人工智能·笔记·python·机器学习·量化
2601_962298673 小时前
Python multiprocessing PicklingError: Can't pickle &l
python·module·multiprocessing·function·picklingerror
CV山月3 小时前
大模型强化学习对齐:从 RLHF 框架到 PPO 算法原理
人工智能·python·大模型·强化学习·多模态·研究生
用户739548002063 小时前
本地 CSV 清洗的小细节:先标准化,再去重,并保留可检查的报告
python
AC赳赳老秦3 小时前
文旅市场公开数据分析:基于 OpenClaw 采集景区客流与门票公示数据,生成区域文旅热度监测报告
java·c语言·python·php·symfony·deepseek·openclaw