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

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

关键改动说明

  1. 使用os.walk()遍历目录树,直接判断当前目录是否为XC,精准定位目标文件,避免遍历无关目录
  2. 移除了未使用的库(matplotlib、numpy、pandas等),简化代码结构
  3. 添加重名处理:用ad_/fib_/pot_作为文件名前缀,防止不同XC下的同名文件被覆盖
  4. 使用os.makedirs(..., exist_ok=True)替代os.mkdir(),避免目录已存在时抛出异常

内容的提问来源于stack exchange,提问作者Gourab Sarker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:46:18