因为有需求,要将图片分流到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