如何用os.walk()查找目录中5分钟以上旧文件?Python2.7替代方案及try块实现
解决方案
一、使用os.walk()查找修改时间超过5分钟的文件
你遇到的tuple object has no attribute stat错误,是因为错误遍历了os.walk()的返回值——os.walk()每次返回(root, dirs, files)元组,若直接遍历元组而非解构它,就会把整个元组当成操作对象,触发该错误。
以下是带try块的实现代码,可处理权限不足等异常,输出符合要求的格式:
import os import time def find_old_files_with_os_walk(root_dir): # 5分钟换算为秒 threshold = 5 * 60 current_time = time.time() for root, dirs, files in os.walk(root_dir): for file_name in files: file_path = os.path.join(root, file_name) try: # 获取文件修改时间戳 mtime = os.path.getmtime(file_path) # 计算当前时间与修改时间的差值(秒) time_diff = current_time - mtime if time_diff > threshold: print(f"{file_name} {time_diff}") except OSError as e: print(f"无法访问文件 {file_path}: {e}") continue # 调用示例,替换为你的目标目录 find_old_files_with_os_walk(".")
关键说明:
- 用
os.path.join(root, file_name)拼接完整文件路径,避免直接对文件名调用文件操作函数出错 try-except块捕获文件访问相关异常,保证脚本不会因单个文件问题中断- 通过
os.path.getmtime()获取修改时间戳,计算时间差判断是否超过5分钟阈值
二、Python2.7中不使用os.walk()的实现方法
Python2.7中可手动递归遍历目录,用os.listdir()配合os.path.isdir()实现,同样加入try块处理异常:
import os import time def find_old_files_without_os_walk(current_dir): threshold = 5 * 60 current_time = time.time() try: items = os.listdir(current_dir) except OSError as e: print(f"无法访问目录 {current_dir}: {e}") return for item in items: item_path = os.path.join(current_dir, item) try: if os.path.isfile(item_path): mtime = os.path.getmtime(item_path) time_diff = current_time - mtime if time_diff > threshold: print(f"{item} {time_diff}") elif os.path.isdir(item_path): # 递归处理子目录 find_old_files_without_os_walk(item_path) except OSError as e: print(f"无法处理 {item_path}: {e}") continue # 调用示例 find_old_files_without_os_walk(".")
关键说明:
- 手动递归遍历每个目录,用
os.listdir()获取目录下所有条目 - 通过
os.path.isfile()和os.path.isdir()区分文件和目录,目录则递归调用自身 - 全程用
try-except捕获目录访问、文件读取等异常,提升脚本健壮性
输出格式示例
运行脚本后会按要求格式输出,例如:
oldfiles 2246342.382509947
list.py 5782357.565317392
files.py 2248789.355661154
内容的提问来源于stack exchange,提问作者chandhan02
相关产品推荐
相关产品推荐

