python实现对文件夹的图片分类存放(自动新建文件夹存放图片)

以下是单个文件夹里的所有图片,我们的目的是把这些图片按照“-”前的数字序号进行分类,存到新的文件夹里。
在这里插入图片描述
“-”前面的数字为类别,后面是对应序号。所以我根据“-”符号获取“-”前面类别进行划分,根据每个类别创建对应文件夹,把各个类别里的图片都放入对应文件夹中去。最终效果
在这里插入图片描述
名为1的文件夹中的内容
在这里插入图片描述
分类成功,如果再次运行,因为图片重复,给他继续延续序号,如果中间的序号不连续有断层,例如(1-0001,1-0005)会自动填补断层(1-0002~1-0004)。
在这里插入图片描述

完成步骤或思路:

①拆分图片的标签:

def seplabel(fname):
    # .前面的字符
    filestr = fname.split(".")[0]
    # -前面的字符
    label = int(filestr.split("-")[0])
    return label

②图片类别的个数:

# 把图片中的类别总个数找出来,即要创建多少个文件夹
def labelnum(fname):  # C:/Users/sinyjam/Desktop/xingzuotu/*.jpg
    # 图片数记录
    num = len(imglist)
    labelnumber = []
    maxlabel = 0
    for i in range(0, num):
        imglist2 = os.path.basename(imglist[i])  # 获取路径下图片名称
        a = seplabel(imglist2)
        labelnumber.append(a)
        set(labelnumber)
        # set去除多余元素,最后数量为[1,2,3,4,5]
        num = len(set(labelnumber))
    return num

③图片具体类别(list存储):

# 把图片中的类别保存下来
def labellist(fname):  # C:/Users/sinyjam/Desktop/xingzuotu/*.jpg
    # 图片数记录
    num = len(imglist)
    labelnumber = []
    labelnumberlist = []
    maxlabel = 0
    for i in range(0, num):
        imglist2 = os.path.basename(imglist[i])  # 获取路径下图片名称
        a = seplabel(imglist2)
        labelnumber.append(a)
        set(labelnumber)
        # set去除多余元素,最后数量为举例:[1,2,3,4,5] 5个
    labelnumberlist = set(labelnumber)
    return labelnumberlist

④读取图片类别数目创建对应类别序号文件夹:

# 创建文件夹
def createfilefloder(fname):
    path = 'C:/Users/sinyjam/Desktop/xingzuotu2/'  # 设置创建后文件夹存放的位置
    for i in labellist(fname):  # 这里创建类别个数个文件夹
        # *定义一个变量判断文件是否存在,path指代路径,str(i)指代文件夹的名字*
        isExists = os.path.exists(path + str(i))
        if not isExists:  # 判断如果文件不存在,则创建
            os.makedirs(path + str(i))
            print("%s 目录创建成功" % i)
        else:
            print("%s 目录已经存在" % i)
            continue  # 如果文件不存在,则继续上述操作,直到循环结束

⑤将图片复制并分类到目标文件夹:

# 读取文件并且复制文件到相应的文件夹,
# 这里的fname2不能是全路径到jpg,最后是文件夹/结尾
def readImgAndSave(fname2):
    ls = os.listdir(fname2)
    for i in ls:
        print(i)
        istr = i.split(".")[0]
        label = istr.split("-")[0]
        dst = os.path.join(destination_path, label)
        new_image = os.path.join(dst, i)
        # print(istr)
        # print(label)
        if not os.path.exists(new_image):
            shutil.copy(fname2 + '/' + i, destination_path + '%s' % label + '/')
        else:
            images = os.listdir(dst)
            max_serial = -1
            for im in images:
                _, serial_num = im.split('-')[0], im.split('-')[1]
                theNum = re.compile('0*([1-9][0-9]*)').findall(serial_num)[0]
                max_serial = max(max_serial, int(theNum))
            max_serial += 1
            new_name = label + '-' + str(max_serial).zfill(4) + '.jpg'
            new_file_path = os.path.join(dst, new_name)
            shutil.copy(fname2 + '/' + i, new_file_path)

⑥将图片转为RGB(可选项):

因为神经网络训练的要求,提前做好RGB转换

# 转RGB
def ChangeToRgb(fname):
    for infile in glob.glob(picturepath):
        # file为前面的所有路径,ext为.jpg,拼在一起是一个完整的路径
        file, ext = os.path.splitext(infile)
        Img = Image.open(infile)
        # 看图片类型。是不是我们要的RGB,不是就转换成RGB
        print(Img.mode, file)
        if Img.mode != 'RGB':
            Img = Img.convert('RGB')

代码

接下来将提供两个版本的代码(思路类似,只是第二种稍作优化,删去了一些冗余代码,看起来简洁)

一、上述拆分步骤的完整代码

from PIL import Image
import numpy as np
import pickle, glob
import os  # 导入创建文件夹模块
import shutil
import re

# 拆分标签
def seplabel(fname):
    # .前面的字符
    filestr = fname.split(".")[0]
    # -前面的字符
    label = int(filestr.split("-")[0])
    return label


# 把图片中的类别总个数找出来,即要创建多少个文件夹
def labelnum(fname):  # C:/Users/sinyjam/Desktop/xingzuotu/*.jpg
    # 图片数记录
    num = len(imglist)
    labelnumber = []
    maxlabel = 0
    for i in range(0, num):
        imglist2 = os.path.basename(imglist[i])  # 获取路径下图片名称
        a = seplabel(imglist2)
        labelnumber.append(a)
        set(labelnumber)
        # set去除多余元素,最后数量为[1,2,3,4,5]
        num = len(set(labelnumber))
    return num


# 把图片中的类别保存下来
def labellist(fname):  # C:/Users/sinyjam/Desktop/xingzuotu/*.jpg
    # 图片数记录
    num = len(imglist)
    labelnumber = []
    labelnumberlist = []
    maxlabel = 0
    for i in range(0, num):
        imglist2 = os.path.basename(imglist[i])  # 获取路径下图片名称
        a = seplabel(imglist2)
        labelnumber.append(a)
        set(labelnumber)
        # set去除多余元素,最后数量为举例:[1,2,3,4,5] 5个
    labelnumberlist = set(labelnumber)
    return labelnumberlist


# 创建文件夹
def createfilefloder(fname):
    path = 'C:/Users/sinyjam/Desktop/xingzuotu2/'  # 设置创建后文件夹存放的位置
    for i in labellist(fname):  # 这里创建类别个数个文件夹
        # *定义一个变量判断文件是否存在,path指代路径,str(i)指代文件夹的名字*
        isExists = os.path.exists(path + str(i))
        if not isExists:  # 判断如果文件不存在,则创建
            os.makedirs(path + str(i))
            print("%s 目录创建成功" % i)
        else:
            print("%s 目录已经存在" % i)
            continue  # 如果文件不存在,则继续上述操作,直到循环结束


# 读取文件并且复制文件到相应的文件夹,
# 这里的fname2不能是全路径到jpg,最后是文件夹"/"结尾
# C:/Users/sinyjam/Desktop/xingzuotu
def readImgAndSave(fname2):
    ls = os.listdir(fname2)
    for i in ls:
        print(i)
        istr = i.split(".")[0]
        label = istr.split("-")[0]
        dst = os.path.join(destination_path, label)
        new_image = os.path.join(dst, i)
        # print(istr)
        # print(label)
        if not os.path.exists(new_image):
            shutil.copy(fname2 + '/' + i, destination_path + '%s' % label + '/')
        else:
            images = os.listdir(dst)
            max_serial = -1
            for im in images:
                _, serial_num = im.split('-')[0], im.split('-')[1]
                theNum = re.compile('0*([1-9][0-9]*)').findall(serial_num)[0]
                max_serial = max(max_serial, int(theNum))
            max_serial += 1
            new_name = label + '-' + str(max_serial).zfill(4) + '.jpg'
            new_file_path = os.path.join(dst, new_name)
            shutil.copy(fname2 + '/' + i, new_file_path)

# 转RGB
def ChangeToRgb(fname):
    for infile in glob.glob(source_path):
        # file为前面的所有路径,ext为.jpg,拼在一起是一个完整的路径
        file, ext = os.path.splitext(infile)
        Img = Image.open(infile)
        # 看图片类型。是不是我们要的RGB,不是就转换成RGB
        print(Img.mode, file)
        if Img.mode != 'RGB':
            Img = Img.convert('RGB')


source_path = "C:/Users/sinyjam/Desktop/xingzuotu/*.jpg"
source_pathf = "C:/Users/sinyjam/Desktop/xingzuotu/"
destination_path = "C:/Users/sinyjam/Desktop/xingzuotu2/"
imglist = glob.glob(source_path)
ChangeToRgb(source_path)
# 类别数print(labelnum(imglist))
# 根据类别数创造文件夹
createfilefloder(labelnum(imglist))
# 打印list里有哪些
# print(labellist("C:/Users/sinyjam/Desktop/xingzuotu/*.jpg"))
readImgAndSave(source_pathf)


如果觉得前面的麻烦,也没事,这里优化了代码,只是分文件夹的话,下面的够用了
简化版代码即可:

二、 精简版(25行超浓缩)

import os
import re
from shutil import copyfile
import shutil
source_path = r'C:\Users\sinyjam\Desktop\aaa'
destination_path = r'C:\Users\sinyjam\Desktop\aaa3'
#返回文件名
images = os.listdir(source_path)
print(images)
num = 0
for i in images:
    category, name = i.split('-')[0], i.split('-')[1]
    src = os.path.join(source_path, i)
    dst = os.path.join(destination_path, category)
    new_image = os.path.join(dst, i)
    if not os.path.exists(dst):
        os.mkdir(dst)
        continue
    elif not os.path.exists(new_image):
        shutil.copy(src, new_image)
    else:
        images = os.listdir(dst)
        max_serial = -1
        for im in images:
            _, serial_num = im.split('-')[0].strip(), im.split('-')[1].strip()
            theNum = re.compile('0*([1-9][0-9]*)').findall(serial_num)[0]
            max_serial = max(max_serial, int(theNum))
        max_serial += 1
        new_name = category + '-' + str(max_serial).zfill(4) + '.jpg'
        new_file_path = os.path.join(dst, new_name)
        shutil.copy(src, new_file_path)

——孙LL&Sinysama

  • 25
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sinysama

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值