参考这里: 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!")
上面使用的是复制,可以看到,在图片的同级目录下,一个新的文件夹被新建了出来,里面放的是正确顺序放的照片。