需求描述
在文件夹“Image01-10”目录下,有10个文件夹,每个文件夹都有20个图片,编号从1.jpg – 19.jpg。由于每次查看都要在多个文件夹下转来转去比较麻烦,所以希望将这个图片放在同一个文件夹中。在命名时,采用统一的格式为 目录名+文件名,同时文件名均采用两位编号。比如 “Image01/1.jpg”,更名后为“01_01.jpg”。
Image01-10
├─Image01
│ 0.jpg
│ 1.jpg
│ 10.jpg
│ 11.jpg
│ 12.jpg
│ 13.jpg
│ 14.jpg
│ 15.jpg
│ 16.jpg
│ 17.jpg
│ 18.jpg
│ 19.jpg
│ 2.jpg
│ 3.jpg
│ 4.jpg
│ 5.jpg
│ 6.jpg
│ 7.jpg
│ 8.jpg
│ 9.jpg
│
├─Image02
├─Image03
...
└─Image10
分析
这是一个的文件复制的需求,包括文件夹遍历、字符串格式化和文件复制的操作,总体难度不大。只需要针对以上三点处理好即可。
文件夹遍布:os.listdir(dir)
字符串格式化:"".format()
文件复制:copyfile(source, dest)
判断文件后缀:"".endWidth(extension)
编码实现
import os
from shutil import copyfile # 提供 copyfile(source, dest) 函数用于文件复制。
# 将文件复制至当前目录下的All文件夹中,所以先对其进行创建
if not os.path.exists("all"):
os.mkdir("all")
for i in range(10):
id = "{0:0>2d}".format(i+1) # 获得用0填充的长度为2的编号,如 1 -> 01
dir = "Image" + id # 文件夹ID
for file in os.listdir(dir):
file = file.lower() # 避免文件大小写问题
if file.endswith('.jpg'):
source = "{0}\\{1}".format(dir, file)
dest = "all\\" + id + "_" + ('0' + file if len(file) == 5 else file)
print("{0} -> {1}".format(source, dest))
copyfile(source, dest) # 复制操作
执行结果
> python mergeimages.py
Image01\0.jpg -> all\01_00.jpg
Image01\1.jpg -> all\01_01.jpg
Image01\10.jpg -> all\01_10.jpg
Image01\11.jpg -> all\01_11.jpg
Image01\12.jpg -> all\01_12.jpg
Image01\13.jpg -> all\01_13.jpg
Image01\14.jpg -> all\01_14.jpg
Image01\15.jpg -> all\01_15.jpg
Image01\16.jpg -> all\01_16.jpg
Image01\17.jpg -> all\01_17.jpg
Image01\18.jpg -> all\01_18.jpg
Image01\19.jpg -> all\01_19.jpg
Image01\2.jpg -> all\01_02.jpg
Image01\20.jpg -> all\01_20.jpg
...
Image10\0.jpg -> all\10_00.jpg
Image10\1.jpg -> all\10_01.jpg
Image10\10.jpg -> all\10_10.jpg
Image10\11.jpg -> all\10_11.jpg
Image10\12.jpg -> all\10_12.jpg
Image10\13.jpg -> all\10_13.jpg
Image10\14.jpg -> all\10_14.jpg
Image10\15.jpg -> all\10_15.jpg
Image10\16.jpg -> all\10_16.jpg
Image10\17.jpg -> all\10_17.jpg
Image10\18.jpg -> all\10_18.jpg
Image10\19.jpg -> all\10_19.jpg
Image10\2.jpg -> all\10_02.jpg
Image10\20.jpg -> all\10_20.jpg
Image10\3.jpg -> all\10_03.jpg
Image10\4.jpg -> all\10_04.jpg
Image10\5.jpg -> all\10_05.jpg
Image10\6.jpg -> all\10_06.jpg
Image10\7.jpg -> all\10_07.jpg
Image10\8.jpg -> all\10_08.jpg
Image10\9.jpg -> all\10_09.jpg