如何用Python递归将子目录中的所有文件移动到主目录?
批量移动所有PNG文件到主目录
目录结构
C:/Documents/A350/a/1.png /2.png b/1.png /B777/a/1.png /B747/a/1.png /2.png b/1.png c/1.png d/1.png /2.png
需求
将所有子文件夹中的.png文件移动到C:/Documents主目录下。
现有递归代码问题
你提供的递归函数只能找到单条最深目录路径,无法遍历所有子目录收集PNG文件,因此没法直接用来实现批量移动。
解决方案
方案一:用pathlib递归查找(简洁高效)
利用pathlib的rglob方法可以直接递归查找所有PNG文件,代码更简洁:
import shutil from pathlib import Path # 主目录路径 target_dir = Path("C:/Documents") target_dir.mkdir(exist_ok=True) # 确保目录存在(可选,主目录已存在可省略) # 递归遍历所有子目录找PNG文件 for png_file in target_dir.rglob("*.png"): # 跳过已在主目录的文件 if png_file.parent == target_dir: continue # 处理重名文件,避免覆盖 target_path = target_dir / png_file.name counter = 1 while target_path.exists(): target_path = target_dir / f"{png_file.stem}_{counter}{png_file.suffix}" counter += 1 # 移动文件 shutil.move(str(png_file), str(target_path))
方案二:修改原递归函数实现
调整递归逻辑,让它遍历所有子目录并收集PNG文件,再批量移动:
import os import shutil from pathlib import Path def collect_all_png(input_path): png_list = [] for item in os.listdir(input_path): full_path = os.path.join(input_path, item) p = Path(full_path) if p.is_dir(): # 递归进入子目录,合并收集到的PNG文件列表 png_list.extend(collect_all_png(full_path)) elif p.suffix.lower() == ".png": # 是PNG文件就加入列表 png_list.append(full_path) return png_list # 主目录路径 main_dir = "C:/Documents" # 收集所有PNG文件路径 all_png_files = collect_all_png(main_dir) # 逐个移动文件到主目录 for png_path in all_png_files: png_file = Path(png_path) target_path = Path(main_dir) / png_file.name # 处理重名 counter = 1 while target_path.exists(): target_path = Path(main_dir) / f"{png_file.stem}_{counter}{png_file.suffix}" counter += 1 shutil.move(png_path, str(target_path))
说明
两种方案都会处理重名文件,避免覆盖原有文件;如果确认没有同名文件,可以去掉重名判断的代码块,直接用shutil.move(png_path, target_dir / png_file.name)。
内容的提问来源于stack exchange,提问作者heihei
相关产品推荐
相关产品推荐

