如何用Python读取文件夹下同名子文件夹XC中的所有PNG文件?
问题描述
我的文件夹结构如下:
F:\WORKS\dataset\SOB\ben ├── ad │ └── XC │ └── *.png ├── fib │ └── XC │ └── *.png └── pot └── XC └── *.png
我需要用Python一次性读取所有XC子文件夹中的.png文件,并将它们迁移到同一个目标文件夹。
之前尝试的代码会迁移ben文件夹下所有的.png文件,无法精准只处理XC目录内的文件,代码如下:
import matplotlib.pyplot as plt import numpy as np import pandas as pd import os from os import listdir from tqdm import tqdm import shutil %matplotlib inline os.mkdir('augmented') os.mkdir('augmented/ben') def getListOfFiles(dirName): listOfFile = os.listdir(dirName) allFiles = list() for entry in listOfFile: fullPath = os.path.join(dirName, entry) if os.path.isdir(fullPath): allFiles = allFiles + getListOfFiles(fullPath) else: allFiles.append(fullPath) return allFiles files_ben = getListOfFiles('/content/drive/MyDrive/Works/dataset/SOB/ben') for f in files_ben: if f.endswith('.png'): shutil.copy(f,'augmented/ben')
解决方案
修改思路
核心是在遍历文件时只筛选路径中包含XC目录的文件,同时添加重名处理逻辑,避免不同XC文件夹下的同名.png文件被覆盖。
优化后的代码
import os import shutil from tqdm import tqdm # 定义源目录和目标目录 source_dir = '/content/drive/MyDrive/Works/dataset/SOB/ben' target_dir = 'augmented/ben' # 创建目标目录(如果不存在则创建,已存在则跳过) os.makedirs(target_dir, exist_ok=True) def get_xc_png_files(dir_name): xc_files = [] # 遍历目录树,root为当前目录路径 for root, dirs, files in os.walk(dir_name): # 判断当前遍历的目录是否是XC if os.path.basename(root) == 'XC': # 收集当前XC目录下的所有png文件 for file in files: if file.endswith('.png'): xc_files.append(os.path.join(root, file)) return xc_files # 获取所有XC目录下的png文件列表 xc_png_files = get_xc_png_files(source_dir) # 批量复制文件到目标目录,处理重名问题 for file_path in tqdm(xc_png_files): # 获取父目录名(ad/fib/pot),用来生成唯一文件名 parent_label = os.path.basename(os.path.dirname(file_path)) original_name = os.path.basename(file_path) # 生成带前缀的文件名,避免重名覆盖 new_file_name = f"{parent_label}_{original_name}" target_file_path = os.path.join(target_dir, new_file_name) shutil.copy(file_path, target_file_path)
关键改动说明
- 使用
os.walk()遍历目录树,直接判断当前目录是否为XC,精准定位目标文件,避免遍历无关目录 - 移除了未使用的库(matplotlib、numpy、pandas等),简化代码结构
- 添加重名处理:用
ad_/fib_/pot_作为文件名前缀,防止不同XC下的同名文件被覆盖 - 使用
os.makedirs(..., exist_ok=True)替代os.mkdir(),避免目录已存在时抛出异常
内容的提问来源于stack exchange,提问作者Gourab Sarker
相关产品推荐
相关产品推荐

