使用python批量重命名+移动照片

参考这里: glob.glob() 函数
查找文件夹下的某格式文件
glob模块用来查找文件目录和文件,返回列表。 glob支持

*: 0个或多个字符
?:一个字符
[]: 指定范围内的字符,如[0-9]匹配数字

定义一个函数查询E盘中以.exe结尾的文件有哪些

def glob_f():    
    from glob import glob  # 导入模块的同名函数

    f = glob(r'e:\*.exe')  # 直接调用函数
    for i in f:
        print(i)

glob_f()

结果:

e:\ttsetup.exe
e:\平板信息.exe

查找指定格式的图片:

from glob import glob 
def find_pic():
    folder = "D:/IVdataset/"
    path_imgs = []
    img_formats = [".png",".bmp"]		# 指定的格式

    for fmt in img_formats:
        path_imgs.extend(glob(folder+'*'+fmt))

    print(path_imgs)
find_pic()

输出结果:

[‘D:/IVdataset\IR1.png’, ‘D:/IVdataset\IR10.png’, ‘D:/IVdataset\IR11.png’, …‘D:/IVdataset\IR22.bmp’, ‘D:/IVdataset\VIS22.bmp’]

测试一下os.path的路径分割,学到了
path = "D:/IVdataset\\IR1.png"
import os
print(os.path.splitext(path))		# ('D:/IVdataset\\IR1', '.png')
print(os.path.split(path))			# ('D:/IVdataset', 'IR1.png')
print(os.path.dirname(path))		#  D:/IVdataset
print(os.path.basename(path))		#  IR1.png

输出:

(‘D:/IVdataset\\IR1’, ‘.png’)
(‘D:/IVdataset’, ‘IR1.png’)
D:/IVdataset
IR1.png

将两边照片分开

接着上面查找完指定格式照片,之后,在函数内部添加:

import os
ir,vis = [],[]
for p in path_imgs:
    ir.append(p) if os.path.basename(p)[:2] == "IR" else vis.append(p)
print(ir,vis)

输出:

[‘D:/IVdataset\IR1.png’, ‘D:/IVdataset\IR10.png’, …, ‘D:/IVdataset\IR22.bmp’]
[‘D:/IVdataset\VIS1.png’, ‘D:/IVdataset\VIS10.png’, …‘D:/IVdataset\VIS22.bmp’]

创建目标文件夹,然后重命名+移动

首先,如果文件夹不存在,要新建一下文件夹

一个函数:

 def mkdir(dir):
	"这个函数创建不存在的 路径文件夹"
	import os
	if not os.path.exists(dir):
		os.makedirs(dir)

ir_folder = "D:/ir_and_vis/Test_ir/"
vis_folder = "D:/ir_and_vis/Test_vi/"
mkdir(ir_folder)
mkdir(vis_folder)
照片批量重命名+移动(会删除原来的图片,相当于移动)

使用os.rename方法,进行批量重命名。

os.rename(i, ir_folder + pic_id + os.path.splitext(i)[1])

上面一句的含义是,比如i'D:/IVdataset\\IR1.png',它会重命名为D:/ir_and_vis/Test_ir/1.png',这也是下面的循环实现的效果。 在这个过程中,保留了原图的格式,但是改变了存放的文件夹,以及文件名。

for index,(i,v) in enumerate(zip(ir,vis)):
    pic_id = str(index + 1)
    os.rename(i, ir_folder + pic_id + os.path.splitext(i)[1])
    os.rename(v, vis_folder + pic_id + os.path.splitext(v)[1])

完整代码:

from glob import glob
import os
        
def find_pic():
	# 拿到文件夹下所以图片的路径
    folder = "D:/IVdataset/"
    path_imgs = []
    img_formats = [".png",".bmp"]
    for fmt in img_formats:
        path_imgs.extend(glob(folder+'*'+fmt))
	
	# 分为2类:ir和vis
	ir,vis = [],[]
    for p in path_imgs:
        ir.append(p) if os.path.basename(p)[:2] == "IR" else vis.append(p)
    # print(ir,vis)
	
	# 若目标文件夹不存在,则创建
    def mkdir(dir):
        if not os.path.exists(dir):
            os.makedirs(dir)

    ir_folder = "D:/ir_and_vis/Test_ir/"
    vis_folder = "D:/ir_and_vis/Test_vi/"
    mkdir(ir_folder)
    mkdir(vis_folder)
	
	# 将源文件夹中图片,重命名后放入新文件夹(移动)
    for index,(i,v) in enumerate(zip(ir,vis)):
        pic_id = str(index + 1)
        os.rename(i, ir_folder + pic_id + os.path.splitext(i)[1])
        os.rename(v, vis_folder + pic_id + os.path.splitext(v)[1])

find_pic()

写在后面

如果,需要复制图片,而不是移动

复制图片,使用的是shutil.copyfile()方法。
同时,在获取文件名时,这里也有一些改动。不同于上面的glob.glob函数,有一个更简单一点的函数os.listdir(dir),可以获取某个文件夹下的所有文件名.
这里有一个例子。在一个文件夹dir下,有一堆图片,它们的名字是以图片序号_模型.jpg存放的。我的需求是,将它们分类,分别放入对应模型名的文件夹中。

def mkdir(dir):
    "这个函数创建不存在的 路径文件夹"
    import os
    if not os.path.exists(dir):
        os.makedirs(dir)
def fusedimg_classification(dir):
    import os,shutil
    filenames=os.listdir(dir)
    # filenames.sort(key=lambda x:int(x[:-4]))

    for pic in filenames:
        # 获取当前图片信息,用于分类
        pic_base_name=pic.split(".")[0]
        target_pic_base_name,target_folder_name = pic_base_name.split("_",1)

        # 放分类图片的文件夹
        target_folder_path = dir+"/"+ target_folder_name
        # 若不存在该文件夹,则新建
        mkdir(target_folder_path)

        pic_path = dir + "/" + pic
        target_pic_path = target_folder_path + "/" + target_pic_base_name + ".png"  # 这里改了个格式。

        shutil.copyfile(pic_path, target_pic_path)  # 复制

dir = "D:/lab1109/VIBF/outputKAIpic/fused_images"
fusedimg_classification(dir)

效果就是,在存放图片的同级目录,新建了许多对应着模型名的文件夹。然后,图片被分类放入,图片名是原来的数字。
在这里插入图片描述

如果,移动时,要保持原来的顺序

只需要对获取的文件名,进行一次按数字排序即可。将上面代码中的filenames.sort(key=lambda x:int(x[:-4]))取消注释就可以了。
当然,在上面这个例子中,移动时是否有序,并不影响结果。但是有的会影响。

如果,移动之后,要调整为原来的顺序

这里有一个例子。
我的源图像,是按顺序放的,即1.png,2.png,3.png,....像下面这样子的:
在这里插入图片描述

但是,移动之后,因为没有同时加排序,就排成了另一种风格:
在这里插入图片描述
查看os获取的顺序,是这样的:'1.png', '10.png', '100.png', '101.png', '..., '2.png', '20.png',...,那么,图片就跟原来的不对应了,这时,我就得调整回来。所以,就有了下面的程序。

它的原理是,os以字符串方式显示文件名顺序时,不同于数字本身的顺序,但是它也有自己的顺序。那么,我是把后者误当成前者来用,要调整的时候,也只需要再反着使用一下就好了。
这个过程,有点像密码的编码和解码

# 将打乱的图像顺序,按照原来的顺序重新梳理一遍
def mkdir(dir):
    "这个函数创建不存在的 路径文件夹"
    import os
    if not os.path.exists(dir):
        os.makedirs(dir)

def rectify_name(dir):
    import os,shutil
    filenames=os.listdir(dir)

    # 排好顺序的,放进新文件夹
    target = dir+'/order_'+dir.split("/")[-1]
    mkdir(target)

    for index,pic in enumerate(filenames):
        file_path = dir + '/' + str(index + 1) +".png"      # 被放错到的位置
        target_file_path = target + '/' + pic               # 应该的正确的位置,这儿利用了os的以字符串方式显示的文件名顺序
        shutil.copyfile(file_path, target_file_path)  # 复制

dir = ["D:/fusion_imgs2/NN/FGAN","D:/fusion_imgs2/NN/PerGAN"]
for d in dir:
    rectify_name(d)

print("ok!")

上面使用的是复制,可以看到,在图片的同级目录下,一个新的文件夹被新建了出来,里面放的是正确顺序放的照片。
在这里插入图片描述

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值