“那些年月的时光” 软件说明书
1. 软件概述
1.1 基本信息
– 开发软件:WorkBuddy
– 软件名称:那些年月的时光
– 版 本 号 :v2.06.260501
1.1.1 适用场景
1. 主要用于在 Windows 10/11 系统中整理手机备份文件。
2. 将指定文件夹内的照片、视频、音频、文档等文件按年月分组归档。
3. 不适用于专业的档案分组管理。
1.1.2 版本历史
– v0.1 ~ 1.0:简化人为操作,实现手机照片按年月分组归档。
– v1.01 ~ 1.19:提升归档准确性,支持照片、视频、音频、文档按年月分组;科学提取照片及微信图片的日期信息;提高处理速度并显示执行时间。
– v2.01 ~ 2.06:重构设计思路,新增统计分析报表,实现归档结果预览,使整理与查重过程更清晰可控。
1.2 核心功能
1.2.1 媒体文件识别与分类
– 支持 图片、视频、音频 三类媒体文件
– 按拍摄日期自动归类到 YYYYMM 格式的子目录
– 多源日期提取:EXIF、ffprobe、ID3、文件名、文件修改时间
1.2.2 统计分析功能
– 并行处理,高速分析目录内所有文件
– 自动标记 MD5 相同的重复文件
– 导出 Excel 报表
1.2.3 清理重复功能
– 一键清理各分类目录中 MD5 相同的重复文件
– 保留最老的文件,其余移动到 清理重复 目录
2. 支持的文件格式
2.1 图片格式
– 标准格式:JPG, JPEG, PNG, BMP, GIF
– 高级格式:HEIC, WebP, TIFF
– RAW格式:CR2, NEF, ARW, DNG, RAW
2.2 视频格式
– 常见格式:MP4, MOV, AVI, MKV, WMV, FLV
– Web格式:WebM, M4V
– 移动格式:3GP, MTS, M2TS
2.3 音频格式
– 常见格式:MP3, WAV, AAC, M4A, OGG
– 无损格式:FLAC, APE
– 其他格式:WMA, Opus
3. 日期提取机制(核心算法)
日期提取遵循严格的优先级顺序,所有提取的日期都会经过合理性校验。
3.1 第一优先级:图片 EXIF 元数据
– 提取字段:DateTimeOriginal(优先) → DateTimeDigitized → DateTime
– EXIF 格式:YYYY:MM:DD HH:MM:SS
– 合理性校验:年份必须在 1980 ~ 当前年份之间
– 失败处理:继续下一优先级
3.2 第二优先级:视频 ffprobe 元数据
– 调用 ffprobe.exe 读取标签
– 支持字段:creation_time, creation_date, DATE
– 支持格式:ISO(2024-06-15T10:30:00.000Z)、标准(%Y-%m-%d %H:%M:%S)、短格式(%Y-%m-%d)、斜杠格式(%Y/%m/%d %H:%M:%S)
– 超时设置:10 秒
– 合理性校验:年份 1980 ~ 当前年份
– 失败处理:继续下一优先级
3.3 第三优先级:音频 ID3 标签
– 支持格式:MP3, FLAC, WAV, OGG
– 支持标签:date, recordingdate, creationdate, TDRC, TCOR
– 支持格式:完整日期(%Y-%m-%d)、纯数字(%Y%m%d)、年份(%Y)
– 合理性校验:年份 1980 ~ 当前年份
– 失败处理:继续下一优先级
3.4 第四优先级:文件名解析
3.4.1 时间戳格式(优先于标准日期格式)
– 微信 13 位毫秒时间戳
正则:mmexport(\d{13}),示例:mmexport1701248706486_1.jpg,除以 1000 转秒,范围校验 946684800 ~ 4102444800(2000–2100 年),与文件修改时间相差 ≤ 365 天。
– 微信 10 位秒时间戳
正则:mmexport(\d{10}),示例:mmexport1701248706.jpg,直接转秒,范围与合理性校验同上。
– 下划线分隔的 13 位时间戳
正则:_(\d{13})_,示例:_1701248706486_.mp4,处理方式同 13 位毫秒戳。
3.4.2 标准日期格式(时间戳匹配失败后)
– 四位年份格式
正则:(\d{4})[-_.\s]?(\d{2})[-_.\s]?(\d{2}),示例:20240615、2024-06-15、2024_06_15、24.06.15;月份 1–12,日期 1–31,年份 1980 ~ 当前。
– 两位年份格式
正则:(\d{2})(\d{2})(\d{2}),示例:240615 → 自动加 2000 年 → 2024年6月15日,校验同上。
3.5 第五优先级:文件修改时间
– 来源:操作系统文件修改时间
– 作为最终回退方案,无需合理性校验
4. 分类规则
4.1 目标目录规则
– 格式:{源目录}/{YYYYMM}/
– YYYY:四位年份,MM:两位月份(01–12)
– 示例:202406 表示 2024 年 6 月
4.2 特殊目录
– 未知日期:197001(默认回退目录)
– 清理重复目录:清理重复
4.3 来源标签说明
– [exif]:图片 EXIF 元数据
– :视频 ffprobe 标签
– :音频 ID3 标签
– [filename]:文件名解析
– 无标签:文件修改时间
5. 文件移动规则
5.1 移动策略
– 安全机制:先复制再删除,避免中断导致文件丢失
5.2 冲突处理规则
– 目标目录无同名文件:直接移动
– 目标有同名文件:
– MD5 一致 → 覆盖目标文件
– MD5 不一致 → 添加数字后缀(_1, _2, _3……)
– 源路径 = 目标路径:跳过(文件已在目录中)
5.3 运行中文件检测
– 检测方式:独占模式打开文件
– 被占用处理:只复制不移动(避免其他程序占用时移动失败)
6. 统计分析功能
6.1 输出字段
字段 说明
文件路径 完整绝对路径
分类目录 根据日期确定的相对路径
文件名 文件名称
文件类型 图片 / 视频 / 音频 / 文件
文件名日期 从文件名解析出的日期(YYYY-MM-DD)
元数据日期 EXIF/ffprobe/ID3 中的日期(YYYY-MM-DD)
文件修改日期 文件系统修改时间(YYYY-MM-DD)
微信时间戳 微信文件名中的时间戳转换后日期(YYYY-MM-DD)
文件大小 KB / MB / GB 格式
MD5 32位十六进制哈希值
重复标识 原始文件(n个) / 重复-N
6.2 重复标识规则
– 分组依据:MD5 哈希值
– 首文件:原始文件(n个)(n 为该组总文件数)
– 其余文件:重复-1, 重复-2……
– 空 MD5 不参与重复检测
6.3 清理重复规则
– 保留策略:保留最老的文件(基于分类日期 YYYYMM)
– 处理方式:移动到 清理重复 目录,保持原始路径结构
– 示例:/Photos/202401/photo.jpg → /清理重复/Photos/202401/photo.jpg
6.4 MD5 计算规则
– 快速模式(默认):文件大小 > 128KB 时,读取前 64KB + 后 64KB + 文件大小,提升大文件处理速度
– 完整模式:文件大小 ≤ 128KB 时,完整读取文件
7. Excel 报表导出
7.1 导出字段
文件路径、分类目录、文件名、文件类型、文件名日期、元数据日期、文件修改日期、微信时间戳、文件大小、MD5、重复标识
7.2 列宽设置(部分关键列)
– 文件路径:30
– 分类目录:10
– 文件名:25
– 文件类型:10
– 日期类字段:15
– MD5:10
7.3 保存位置
– 自动保存到程序所在目录
– 文件名格式:统计分析_YYYYMMDD_HHMMSS.xlsx
8. 界面功能
8.1 主界面布局
– 标题栏:那些年月的时光 v{版本号}
– 默认窗口尺寸:700×500,最小尺寸:550×400,屏幕居中
8.2 目录选择区
– 显示当前选中的文件夹路径,默认状态为“未选择目录”,支持拖拽选择(可选)
8.3 功能按钮
– 选择目录、统计分析、报表导出、开始分类、清理重复、打开目录(资源管理器)
8.4 进度显示
– 进度条、计时器(⏱ X 秒)、完成状态(✓ 耗时 XX 秒)
8.5 日志输出区
– 启动时显示 README.md 内容,运行时切换为操作日志
– 最大行数:500 行(自动清理旧日志),提供清空按钮
9. 版本号规范
格式:v主版本.递增序号.日期码
示例:v2.06.260501 → 主版本 2,递增序号 06(01–99 循环),日期码 260501(YYMMDD)
10. 技术规格
10.1 运行环境
– Python:3.13
– GUI 框架:Tkinter
– 操作系统:Windows 10/11(64位)
10.2 依赖库
– Pillow >= 10.0.0:EXIF 读取
– mutagen >= 1.47.0:音频元数据
– openpyxl:Excel 导出
– ffprobe.exe:视频元数据提取
10.3 技术特性
– 多线程处理:GUI 主线程 + 文件操作后台线程
– 并行处理:统计分析使用多线程
– 实时进度:每秒更新进度和计时
– 内存管理:日志超 500 行自动清理
11. 注意事项
11.1 数据安全
– 分类会移动文件,请提前备份重要数据
– 正在运行的文件只复制不移动,避免占用冲突
– 文件名冲突时自动添加数字后缀
11.2 特殊情况
– 未知日期文件 → 归类到 197001 目录
– 清理重复:保留最老文件,其余移到 清理重复 目录(保持原始路径结构)
11.3 已处理情况
– 年份合理性校验(1980–当前年份)
– 时间戳合理性校验(与修改时间相差 ≤ 365 天)
– 日期合法性校验(考虑月份天数)
12. 错误处理
12.1 常见错误
– ffprobe.exe 不存在:跳过视频元数据提取
– EXIF 读取失败:继续下一优先级
– 文件被占用:只复制不移动
– MD5 计算失败:返回空字符串
12.2 超时处理
– ffprobe 超时(10 秒):跳过并继续处理下一个文件
附录 A:核心模块说明
– date_extractor.py:从各种来源获取文件拍摄日期
– file_organizer.py:安全移动文件,处理冲突
– statistics.py:扫描目录,提取详细信息,标记重复文件
– logger.py:日志回调和格式化输出
附录 B:文件结构
media-date-sorter/
├── main.py # 主程序入口,GUI界面
├── core/
│ ├── __init__.py
│ ├── date_extractor.py
│ ├── file_organizer.py
│ └── statistics.py
├── utils/
│ ├── __init__.py
│ └── logger.py
├── requirements.txt
├── ffprobe.exe
└── README.md
附录 C:命令行打包
pyinstaller –onefile –windowed –name NaxYears_v206_260501 main.py –clean
打包后重命名为:那些年月的时光v2.06.260501.exe
—
夜雨聆风