Python os.walk脚本仅统计最后一个子文件夹文件问题求助
文件夹文件统计脚本修复方案
问题根源
你当前脚本只统计最后一个子文件夹,核心原因是每次遍历文件夹时没有保留之前的统计结果,而是重复覆盖了同一个计数器变量,导致最终只剩最后一次循环的数据。
修复方案:正确使用os.walk
os.walk会递归遍历目标目录的所有子文件夹,每次循环返回当前文件夹路径、子文件夹列表、文件列表。我们只需要用一个字典存储每个文件夹的统计数据,避免覆盖即可:
import os def count_folder_files(root_dir): # 存储每个文件夹的统计信息:键为文件夹路径,值为统计字典 folder_stats = {} for dirpath, _, filenames in os.walk(root_dir): total = len(filenames) ext_counts = {} # 统计当前文件夹的扩展名 for name in filenames: _, ext = os.path.splitext(name) # 统一转小写,避免.TXT和.txt被视为不同扩展名 ext = ext.lower() ext_counts[ext] = ext_counts.get(ext, 0) + 1 # 将当前文件夹的统计结果存入字典 folder_stats[dirpath] = { "total_files": total, "extension_counts": ext_counts } return folder_stats # 调用示例 target_dir = "/你的目标根目录路径" results = count_folder_files(target_dir) # 打印统计结果 for folder, stats in results.items(): print(f"文件夹:{folder}") print(f"总文件数:{stats['total_files']}") print("扩展名分布:") for ext, cnt in stats['extension_counts'].items(): print(f" {ext}: {cnt}") print("-" * 40)
替代实现:使用pathlib(更简洁的现代写法)
Python 3.4+ 推荐使用pathlib模块,它提供了面向对象的文件系统操作,代码更易读:
from pathlib import Path def count_folder_files_pathlib(root_dir): folder_stats = {} root_path = Path(root_dir) # 递归遍历所有子目录(包括根目录) for dir_path in root_path.rglob("*"): if not dir_path.is_dir(): continue # 获取当前目录下的所有文件 files = [f for f in dir_path.iterdir() if f.is_file()] total = len(files) ext_counts = {} for file in files: ext = file.suffix.lower() ext_counts[ext] = ext_counts.get(ext, 0) + 1 folder_stats[str(dir_path)] = { "total_files": total, "extension_counts": ext_counts } return folder_stats # 调用示例 target_dir = "/你的目标根目录路径" results = count_folder_files_pathlib(target_dir) # 打印结果 for folder, stats in results.items(): print(f"文件夹:{folder}") print(f"总文件数:{stats['total_files']}") print("扩展名分布:") for ext, cnt in stats['extension_counts'].items(): print(f" {ext}: {cnt}") print("-" * 40)
内容的提问来源于stack exchange,提问作者Gabe
相关产品推荐
相关产品推荐

