将图片合理分配到n个文件夹

因为有需求,要将图片分流到8个文件夹,并且做到平均分配,所以花了一天写了一个,代码如下:

import os
import shutil
import time
import sys
import glob

path = 'C:/Users/8190741/Desktop/TapeAIR_GaP/img/'#待移动图片文件路径
newPath = 'C:/Users/8190741/Desktop/TapeAIR_GaP/{}'#存放的新的图片文件路径

def list_all_files(rootdir):
    """
    传入文件夹路径,将当前文件夹下的所有文件都找出来
    """
    _files = []
    list = os.listdir(rootdir) #列出文件夹下所有的目录与文件
    for i in range(0,len(list)):
            path = os.path.join(rootdir,list[i])
            if os.path.isfile(path):
                _files.append(path)
    return _files

def png_files(rootdir):
    """
    通过list_all_files方法获得所有文件后再进行查找PNG图片
    """
    list_name =[]
    _fs = list_all_files(rootdir)  #每个文件的绝对路径
    import re
    for path in _fs:
        path = path.replace('\\','/')
        if path.endswith('PNG') or path.endswith('png'):
            list_name.append(path)
    return list_name

def is_valid_png(png_file):
    """
    接收一张png图片,判断完整性
    """
    try:
        with open(png_file, 'rb') as f:
            f.seek(-2, 2)
            buf = f.read()
            return buf == b'\x60\x82'
    except OSError as e:
        time.sleep(1)
        restart_program()

def restart_program():
    """
    进行程序重启
    """
    python = sys.executable
    os.execl(python,python, * sys.argv)

if __name__ == "__main__":
    n = 1 #初始文件夹编号
    e = 8 #总共文件夹数
    while 1:
        imgs = png_files(path)   #总的图片路径
        newimg = newPath.format(n)  #文件路径
        num = 0
        for i in range(1,e+1):  #获取所有图片文件的待处理总数
            num1 = glob.glob('/mnt/countimage/ForAIR/Gap/CountImage/{}/*.PNG'.format(i))
            num += len(num1)
        avg_number = num/e   #获取平均数
        if len(imgs) > 0:   #如果有待移动的图片
            img = imgs[0]
            _isvalid = is_valid_png(img)
            if _isvalid:
                imgname = img.split('/')[-1]
                num_file = glob.glob('/mnt/countimage/ForAIR/Gap/CountImage/{}/*.PNG'.format(n))  #获取n号文件下的图片数量
                if len(num_file) > avg_number: #判断是否大于平均值,大于就跳过
                    if n == e+1: #如果到最后一个,重置为1
                        n=1
                    else:    #否则加1
                        n+=1
                    continue
                if not os.path.exists(newimg+imgname): #新文件中没有目标图片才执行操作
                    try:
                        shutil.move(img,newimg)  #移动到新文件夹
                    except:
                        restart_program()
                    print("已经将图片{}移动到了{}号文件夹!".format(imgname,n))
                    n+=1
                if n==e+1:
                    n=1

 

你可能感兴趣的:(python)