如何在Python中高效移动文件并归类整理无序子文件夹?
Python实现文件按类型归类到新目录
核心思路
遍历源文件夹下所有子目录中的文件,根据文件后缀名(统一小写处理)创建对应分类目录,将文件移动到目标分类目录中,同时处理重复文件名避免覆盖。
完整代码实现
import os import shutil def get_unique_filename(directory, filename): """生成不重复的目标文件名""" base_name, ext = os.path.splitext(filename) counter = 1 while True: # 生成带计数器的文件名(仅当重复时添加) new_filename = f"{base_name}({counter}){ext}" if counter > 1 else filename target_path = os.path.join(directory, new_filename) if not os.path.exists(target_path): return target_path counter += 1 def organize_files(source_dir, target_dir): """将源文件夹的文件按类型归类到目标文件夹""" # 遍历源文件夹下所有文件(包括子目录) for root, _, files in os.walk(source_dir): for file in files: file_full_path = os.path.join(root, file) # 跳过目录(os.walk的files列表已过滤目录,此处做双重保险) if not os.path.isfile(file_full_path): continue # 获取文件后缀并转小写 _, ext = os.path.splitext(file) ext = ext.lower() # 确定分类子目录 if ext: # 去掉后缀前的点,比如将".txt"转为"txt"作为目录名 category_dir = os.path.join(target_dir, ext[1:]) else: # 无后缀文件统一归类到"无后缀文件"目录 category_dir = os.path.join(target_dir, "无后缀文件") # 创建分类目录(已存在则跳过) os.makedirs(category_dir, exist_ok=True) # 生成不重复的目标文件路径 target_file_path = get_unique_filename(category_dir, file) # 移动文件,捕获异常避免程序中断 try: shutil.move(file_full_path, target_file_path) print(f"成功移动: {file_full_path} → {target_file_path}") except Exception as e: print(f"移动失败 {file_full_path}: {str(e)}") # ---------------------- 使用示例 ---------------------- if __name__ == "__main__": # 替换为你的源文件夹和目标文件夹路径 SOURCE_FOLDER = "D:/待整理文件夹" TARGET_FOLDER = "D:/已整理文件夹" organize_files(SOURCE_FOLDER, TARGET_FOLDER) print("文件整理完成!")
关键细节说明
- 全目录遍历:使用
os.walk递归遍历源文件夹下所有子目录,确保没有遗漏任何文件 - 统一后缀规则:将后缀转为小写,避免
.TXT和.txt被归为不同类别 - 重复文件处理:通过
get_unique_filename函数自动生成带计数器的文件名,防止覆盖已存在的文件 - 健壮性保障:添加
try-except捕获移动文件时的异常(如文件被占用、权限不足等),确保程序能继续处理其他文件 - 灵活分类规则:如果需要自定义分类(如把jpg/png/gif归为"图片"类),可以添加后缀映射字典,示例如下:
# 自定义分类映射 EXT_CATEGORY_MAP = { ".jpg": "图片", ".png": "图片", ".gif": "图片", ".txt": "文档", ".docx": "文档", ".xlsx": "表格" } # 在确定分类目录时替换为: category_dir = os.path.join(target_dir, EXT_CATEGORY_MAP.get(ext, ext[1:] if ext else "无后缀文件"))
内容的提问来源于stack exchange,提问作者LM10
相关产品推荐
相关产品推荐

