Skip to content

对指定目录及子目录下的照片进行分类, 先按年再按地点分类, 文件名重命名为"年-地点-时间戳"

Notifications You must be signed in to change notification settings

yuzhiyongcn/photo-classifier

Repository files navigation

照片分类器 (Photo Classifier)

基于Python3的智能照片视频分类整理工具,能够自动根据拍摄日期对媒体文件进行分类、重命名和去重处理。

程序功能概述

本程序主要用于批量整理和分类照片、视频文件,具备以下核心功能:

  1. 智能日期识别: 从EXIF信息或文件属性中提取拍摄/创建日期
  2. 重复文件检测: 使用MD5哈希值检测并删除重复文件
  3. 自动分类存储: 按年/月/日目录结构分类存储文件
  4. 统一命名规则: 将文件重命名为"年-月-日-MD5哈希值.扩展名"格式
  5. 多格式支持: 支持常见的图片和视频格式

程序架构设计

核心类: Classifier

程序采用面向对象设计,主要逻辑封装在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", # 图片输出目录
)

改进建议

1. 代码结构优化

  • 配置外部化: 将硬编码的路径配置移到配置文件或命令行参数
  • 错误处理增强: 加强异常处理机制,提供更详细的错误信息
  • 日志系统: 引入专业的日志框架替代print语句

2. 功能扩展

  • 进度显示: 添加处理进度条和预估完成时间
  • 并发处理: 支持多线程处理提升大量文件的处理速度
  • 增量同步: 支持仅处理新增文件,避免重复扫描
  • 文件恢复: 提供误删文件的恢复机制

3. 用户体验改进

  • GUI界面: 开发图形化界面,提升用户操作便利性
  • 配置验证: 在执行前验证输入输出路径的有效性
  • 处理报告: 生成详细的处理报告,包括统计信息和错误列表

4. 技术架构升级

  • 数据库优化: 考虑索引优化,提升大量文件的查询性能
  • 内存管理: 优化大文件处理时的内存使用
  • 跨平台支持: 改进Windows特定代码,增强跨平台兼容性

5. 安全性增强

  • 权限检查: 验证对输入输出目录的读写权限
  • 数据备份: 在执行文件移动前创建操作日志备份
  • 回滚机制: 提供操作回滚功能,以防误操作

6. 性能优化建议

# 示例:添加文件大小检查,跳过过小文件
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: 轻量级数据库

注意事项

  1. 程序会永久删除检测到的重复文件,请谨慎使用
  2. 建议在正式使用前先在测试目录中验证
  3. 确保有足够的磁盘空间用于文件移动操作
  4. Windows环境下需要安装pywin32包

About

对指定目录及子目录下的照片进行分类, 先按年再按地点分类, 文件名重命名为"年-地点-时间戳"

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages