基于Python3的智能照片视频分类整理工具,能够自动根据拍摄日期对媒体文件进行分类、重命名和去重处理。
本程序主要用于批量整理和分类照片、视频文件,具备以下核心功能:
- 智能日期识别: 从EXIF信息或文件属性中提取拍摄/创建日期
- 重复文件检测: 使用MD5哈希值检测并删除重复文件
- 自动分类存储: 按年/月/日目录结构分类存储文件
- 统一命名规则: 将文件重命名为"年-月-日-MD5哈希值.扩展名"格式
- 多格式支持: 支持常见的图片和视频格式
程序采用面向对象设计,主要逻辑封装在Classifier
类中:
mode
: 运行模式(开发/生产)IMAGE_EXTENTIONS
: 支持的图片格式VIDEO_EXTENTIONS
: 支持的视频格式PHOTO_EXIF_KEYS
: EXIF信息关键字段SKIP_FOLDERS
: 跳过处理的系统文件夹
1. 数据库管理
connect_database()
: 连接SQLite数据库create_table()
: 创建MD5记录表add_record()
: 添加文件MD5记录validate()
: 验证文件是否重复
2. 文件识别与处理
is_photo()
: 判断是否为含EXIF的照片is_video()
: 判断是否为视频文件is_image()
: 判断是否为图片文件contains_exif()
: 检查是否包含EXIF信息
3. 日期提取
get_photo_create_date()
: 从照片EXIF提取拍摄日期get_video_create_date()
: 从视频属性提取创建日期read_date()
: 统一日期读取接口,支持回退到文件修改时间
4. 文件操作
process_folder()
: 递归处理文件夹process_file()
: 处理单个文件rename_move()
: 重命名并移动文件到目标目录delete_folders()
: 清理空文件夹
1. 初始化配置和数据库连接
2. 递归扫描输入目录
3. 对每个文件进行以下处理:
├── 计算MD5哈希值
├── 检查数据库是否存在重复(存在则删除)
├── 提取拍摄/创建日期
├── 根据文件类型选择输出目录
├── 创建年/月/日目录结构
├── 按规则重命名并移动文件
└── 将MD5记录存入数据库
4. 清理空文件夹
5. 关闭数据库连接
- 照片目录 (
photo_output
): 包含EXIF信息的图片文件 - 视频目录 (
video_output
): 视频文件 - 图片目录 (
image_output
): 不含EXIF的普通图片文件
输出根目录/
├── 2024/
│ ├── 01/
│ │ ├── 01/
│ │ │ ├── 2024-01-01-a1b2c3d4e5f6...jpg
│ │ │ └── 2024-01-01-f6e5d4c3b2a1...mp4
│ │ └── 02/
│ └── 02/
└── 2023/
当前配置为测试环境:
cf = Classifier(
input_folder=r"D:\temp\test\input", # 输入目录
photo_output=r"D:\temp\test\output\photo", # 照片输出目录
video_output=r"D:\temp\test\output\video", # 视频输出目录
image_output=r"D:\temp\test\output\image", # 图片输出目录
)
- 配置外部化: 将硬编码的路径配置移到配置文件或命令行参数
- 错误处理增强: 加强异常处理机制,提供更详细的错误信息
- 日志系统: 引入专业的日志框架替代print语句
- 进度显示: 添加处理进度条和预估完成时间
- 并发处理: 支持多线程处理提升大量文件的处理速度
- 增量同步: 支持仅处理新增文件,避免重复扫描
- 文件恢复: 提供误删文件的恢复机制
- GUI界面: 开发图形化界面,提升用户操作便利性
- 配置验证: 在执行前验证输入输出路径的有效性
- 处理报告: 生成详细的处理报告,包括统计信息和错误列表
- 数据库优化: 考虑索引优化,提升大量文件的查询性能
- 内存管理: 优化大文件处理时的内存使用
- 跨平台支持: 改进Windows特定代码,增强跨平台兼容性
- 权限检查: 验证对输入输出目录的读写权限
- 数据备份: 在执行文件移动前创建操作日志备份
- 回滚机制: 提供操作回滚功能,以防误操作
# 示例:添加文件大小检查,跳过过小文件
def is_valid_file_size(self, file_path):
return os.path.getsize(file_path) > 1024 # 大于1KB
# 示例:批量数据库操作
def batch_add_records(self, md5_list):
cursor = self.db.cursor()
cursor.executemany("INSERT INTO {}(MD5) VALUES(?)".format(self.table),
[(md5,) for md5 in md5_list])
self.db.commit()
- Python 3.x
- exifread: EXIF信息读取
- pytz: 时区处理
- win32com: Windows媒体属性读取
- SQLite3: 轻量级数据库
- 程序会永久删除检测到的重复文件,请谨慎使用
- 建议在正式使用前先在测试目录中验证
- 确保有足够的磁盘空间用于文件移动操作
- Windows环境下需要安装pywin32包