如何使用Python将多级子文件夹中的图片复制到单个文件夹
用Python批量复制多级子文件夹中的图片到单个文件夹
需求说明
需要将main_folder下所有多级子文件夹中的图片文件,统一复制到一个名为destination_folder的单独文件夹中,保留原文件名(需处理文件名重复情况)。
原文件夹结构
$ tree . ├── main_folder │ ├── Subfolder_1 │ │ └── Subfolder1_1 │ │ ├── 0.png │ │ ├── 1.png │ │ ├── 2.png │ │ └── 3.png │ │ └── Subfolder1_2 │ │ ├── 4.png │ │ ├── 5.png │ │ ├── 6.png │ │ └── 7.png │ ..... │ ├── Subfolder_2 │ │ └── Subfolder2_1 │ │ ├── 8.png │ │ └── 9.png │ │ └── Subfolder2_2 │ ├── 10.png │ ├── 11.png │ ├── 12.png │ └── 13.png │ └── Subfolder_3 │ └── Subfolder3_1 │ ├── 14.png │ ├── 15.png │ ├── 16.png │ └── Subfolder3_2 │ ├── 17.png │ ├── 18.png │ ├── 19.png │ └── 20.png │ └── script.py
预期目标文件夹结构
── destination_folder ├── 0.png ├── 1.png ├── 2.png ├── 3.png ......... ├── n-1.png └── n.png
解决方案
方法1:使用os+shutil标准库实现
无需额外安装依赖,用Python内置模块完成遍历和复制,自动处理同名文件重命名。
import os import shutil # 定义源文件夹和目标文件夹路径 source_dir = "./main_folder" dest_dir = "./destination_folder" # 创建目标文件夹(不存在则自动创建) os.makedirs(dest_dir, exist_ok=True) # 遍历源文件夹下所有层级的文件 for root, _, files in os.walk(source_dir): for file in files: # 筛选图片格式,可自行添加需要的格式(如.jpg/.gif) if file.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')): source_path = os.path.join(root, file) dest_path = os.path.join(dest_dir, file) # 处理文件名重复的情况 counter = 1 while os.path.exists(dest_path): name, ext = os.path.splitext(file) dest_path = os.path.join(dest_dir, f"{name}_{counter}{ext}") counter += 1 # 复制文件(保留原文件元数据) shutil.copy2(source_path, dest_path) print(f"已复制: {source_path} -> {dest_path}")
方法2:使用pathlib模块(Python3.4+ 更简洁)
用面向对象的路径操作方式,代码更易读维护。
from pathlib import Path import shutil # 定义源文件夹和目标文件夹路径 source_dir = Path("./main_folder") dest_dir = Path("./destination_folder") # 创建目标文件夹(递归创建父目录,不存在则自动创建) dest_dir.mkdir(parents=True, exist_ok=True) # 定义需要筛选的图片格式 image_extensions = ('.png', '.jpg', '.jpeg', '.gif') # 递归遍历所有图片文件 for image_path in source_dir.rglob(f"*{image_extensions}"): dest_path = dest_dir / image_path.name # 处理文件名重复 counter = 1 while dest_path.exists(): name = image_path.stem ext = image_path.suffix dest_path = dest_dir / f"{name}_{counter}{ext}" counter += 1 # 复制文件 shutil.copy2(image_path, dest_path) print(f"已复制: {image_path} -> {dest_path}")
使用步骤
- 将上述任一代码保存到
script.py文件中(与main_folder同级) - 根据实际需求修改
source_dir、dest_dir以及图片格式列表 - 运行脚本:
python script.py
内容的提问来源于stack exchange,提问作者Mohammed
相关产品推荐
相关产品推荐

