You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:11:13