每次翻手机相册都头疼。几千张照片混在一起,自拍、风景、饭局、文档截图全堆着。找张上个月聚餐的合影,手指划到发酸。后来我写了个Python脚本,总算解决了这个麻烦。
先说说需求。其实很直白,我想让照片按拍摄时间分年月的文件夹,比如“2025年3月”。还得按照片里的人物分块,比如“和爸妈”、“同学聚会”。场景也要管,拍的食物、街景、猫咪自己待一边。这三个维度一叠,整理起来就清楚了。
写代码前我得做些准备。电脑上装好Python,再装两个库。一个叫PIL的Pillow,用来读照片的拍摄日期。另一个叫face_recognition,能识别人脸。这两个东西在终端敲pip install就能装好。手机上照片先全部通过数据线拷到一个文件夹里,我习惯叫它“手机相册备份”。
大部分手机照片都内嵌拍摄时间。这信息藏在照片文件的exif数据里。我用Pillow库读取它,假如照片是2024年12月拍的,我就把它挪到“2024年12月”这个子文件夹里。少部分照片没日期信息,我会看文件的修改时间,虽然有时候不准,但比没有强。比如视频文件,修改时间基本接近拍摄时间。
人物识别这块有点意思。face_recognition库能框出人脸。我建了一个列表,里面存了几张“参考照片”,比如“我自己的大头照”、“同事们的合照”、“一家三口的合影”。程序扫每张照片时,检测到人脸就跟我这个列表做比对。匹配度高于某个值,就算识别成功。比如检测到的人脸跟我存储的“爸妈”参考照片相似,照片就被归进“人物_爸妈”文件夹。如果一张照片里同时识别出爸妈和我,那照片会同时放进这三个文件夹?不,我设计成只放入一个主要人物的文件夹,根据首次出现的顺序决定。
场景分类我用了最笨的方法。拍食物时背景大多是桌面、盘子、筷子。拍风景时天空占比大、颜色偏蓝绿。自拍时人脸占比特别大。我写了几十个if判断,比如“如果照片蓝色像素超过30%,并且没有检测到人脸,就放进‘场景_天空与风景’文件夹”。这招虽然粗暴,但对付我这种普通用户足够了。真要精准的场景识别,得用深度学习模型,那个太复杂,我懒得折腾。猫照片更好办,用另一个叫“猫脸识别”的库,前提是我电脑里先存几只猫的照片。
实现的核心是shutil模块。它负责把文件移动或复制到新位置。我写了个循环,遍历整个备份文件夹。每张照片都做三件事:读日期拿去分类,识别人脸拿去分类,分析像素分布拿去分类。最后把照片复制到“已分类”文件夹下面对应的子文件夹里。原件保留不动,防止误删。
跑这个脚本花了二十分钟。我的手机相册有五千多张照片。最后生成了三十多个文件夹。比如 “2025年01月_人物_孩子”、“2025年01月_场景_聚餐”、“2024年12月_人物_同事”。名字虽然长,但一眼就能看明白。找照片时不用再翻手机相册,直接进电脑文件夹搜索。
有几次识别错了。比如把一张雕塑脸当成真人。还有一次把夕阳的橙色天空识别成了食物,因为橙色像素多。这些错漏我手动调整一下就好。反正脚本跑完后,自己过一遍,把明显不对的文件拽到正确文件夹。整个过程比我预想省力。以前手动整理一周都搞不定,现在半小时就完成了九成工作。
有人问我为啥不用手机自带的智能相册。我觉得手机那些功能不够灵活。比如我想把某张十年前旧照片翻出来,手机相册按时间线滚动很慢。现在用文件夹管理,想找哪年哪月的照片,直接点进去就行。还有一个好处,这个脚本不依赖网络,所有数据都在自己硬盘里,隐私上更放心。
你要也想这么做,记得先备份原文件,脚本操作前一定要做这一步。程序一旦出bug,可能把你照片弄乱。我碰过一回,有个文件名里带了奇怪符号,代码报错,照片没移动成功。后来加了异常处理,遇到不能读的文件就直接跳过,把文件名记录到日志里。这样就不会卡住整个流程。
整理完相册那天晚上,我翻看那些文件夹。看到2023年夏天拍的稻城亚丁,想起高反时头疼的感觉。看到前年女儿第一次上幼儿园那天的自拍,她书包挂着小熊挂件。这些照片在手机里时,就只是一个个小图标。现在按场景人物分好,感觉像是在翻一本实体相册,每段记忆都有自己该待的地方。