代码与工具 2 分钟阅读

照片按地点自动归档

手机相册里攒了三年照片,每次想找某个地方拍的图,都得靠回忆时间线慢慢翻。上个月我决定动手,把照片按拍摄地点自动分到文件夹里。 先 […]

照片按地点自动归档

手机相册里攒了三年照片,每次想找某个地方拍的图,都得靠回忆时间线慢慢翻。上个月我决定动手,把照片按拍摄地点自动分到文件夹里。

先看看照片里有什么

第一步不是写代码,是检查数据。我导出手机里所有照片,用 exiftool 扫了一遍,发现大部分照片都带 GPS 坐标,但有几类例外:截图没有坐标,微信保存的图坐标被抹掉了,还有一部分老照片只有日期没有位置。这决定了归档策略——有坐标的按地点分,没坐标的单独放一个“未定位”文件夹,不强行猜。

把坐标变成地名

有了经纬度,下一步是反查地名。我试了两个方案:调用在线地图 API 和用离线的 GeoNames 数据库。在线 API 精度高但有限额,三年照片几千张,跑一半就被限流。最后选了离线方案:下载 GeoNames 的 cities 数据,用 Python 的 reverse_geocoder 库在本地匹配最近的城市。精度到城市级别,对我够用了。匹配结果会得到类似“杭州市”“成都市”这样的名字,偶尔也会出现“某某县”,我统一归到地级市,避免文件夹太碎。

写个脚本跑起来

脚本逻辑很简单:遍历照片,读 EXIF 的 GPS 坐标,反查城市名,然后按“年份/城市”的层级移动文件。我加了两条规则:一是同一天在同一城市拍的多张照片,只移动一次目录;二是遇到同名文件自动加序号,防止覆盖。跑之前先做 dry-run,把计划移动的路径打印出来,确认没问题再真移。第一次跑完发现“未定位”文件夹里有两百多张,大部分是截图和表情包,顺手也按年份分了。

跑完之后的意外收获

归档完成后,我打开“2022/大理市”这个文件夹,发现那年秋天在洱海边拍的一组照片,之前完全忘了。按地点分文件夹有个副作用:你会重新看见自己去过的地方,而不是被时间线推着走。另外,脚本跑第二遍时几乎瞬间完成,因为大部分照片已经在目标目录里,跳过了。这让我想到可以把它挂到 cron 上,每月自动整理新照片。

现在找照片的方式变了:先想“哪一年”,再想“哪个城市”,点进去就是那趟旅行的全部记录。偶尔也会打开“未定位”翻翻截图,像在清理旧抽屉。

留下你的回声