在处理大量图片文件时,手动操作既耗时又容易出错。幸运的是,Python提供了强大的标准库,可以帮助我们轻松地实现文件的批量操作。本文将详细介绍如何使用glob、shutil和os库,实现图片的批量复制。
一、前言
在数据处理、机器学习和计算机视觉等领域,经常需要对大量的图片文件进行操作,如复制、移动、重命名等。高效地处理这些文件,对于提高工作效率至关重要。
二、涉及的Python库简介
- glob库
glob模块用于查找符合特定规则的文件路径名。它支持Unix风格的路径名模式匹配,可用于批量获取指定类型的文件列表。
常用通配符:
*:匹配0个或多个字符
?:匹配1个字符
[]:匹配指定范围内的字符,如[0-9]
- shutil库
shutil模块提供了高级的文件操作功能,如复制、移动、压缩和解压缩等。
shutil.copy(src, dst):将文件从src复制到dst,如果dst是一个目录,则将文件复制到该目录下。
- os库
os模块提供了与操作系统进行交互的功能,如文件和目录的创建、删除、遍历等。
os.listdir(path):返回指定路径下的文件和目录列表。
os.path.join(path, *paths):将多个路径组合后返回。
三、代码实现
下面是使用glob、shutil和os库实现图片批量复制的代码示例。
import os
import shutil
def copy_images(src_dir, dst_dir, image_formats=('jpg', 'png', 'jpeg', 'bmp', 'gif')):
"""
将源目录中的所有图片文件复制到目标目录。
:param src_dir: 源目录路径
:param dst_dir: 目标目录路径
:param image_formats: 要复制的图片文件格式,默认包含常见格式
"""
# 确保目标目录存在
if not os.path.exists(dst_dir):
os.makedirs(dst_dir)
print(f"目标目录 {dst_dir} 已创建。")
# 遍历源目录中的所有文件
for root, dirs, files in os.walk(src_dir):
for file in files:
# 检查文件扩展名是否在指定的图片格式中
if file.lower().endswith(image_formats):
src_file = os.path.join(root, file)
dst_file = os.path.join(dst_dir, file)
try:
shutil.copy2(src_file, dst_file)
print(f"已复制 {src_file} 到 {dst_file}")
except Exception as e:
print(f"复制文件 {src_file} 时出错:{e}")
if __name__ == "__main__":
source_directory = r'D:\biyesheji\VOC2012\SegmentationClass' # 源目录
destination_directory = r'D:\biyesheji\VOC2012\test' # 目标目录
copy_images(source_directory, destination_directory)
代码解释
函数定义:定义了copy_images函数,用于将指定格式的图片从源目录复制到目标目录。
目标目录检查:使用os.path.exists检查目标目录是否存在,如果不存在则使用os.makedirs创建。
遍历源目录:使用os.walk遍历源目录下的所有文件和子目录。
文件格式检查:通过str.endswith方法,筛选出指定格式的图片文件。
文件复制:使用shutil.copy2方法,复制文件并保留元数据(如修改时间)。
异常处理:在复制过程中捕获可能的异常,并打印错误信息。
四、总结
本文介绍了如何使用Python的glob、shutil和os库,实现图片的批量复制。通过对代码的详细讲解和优化,我们不仅实现了基本的复制功能,还提高了代码的健壮性和执行效率。