用 Python 按款号自动归档商品图片:os 与 shutil 实战
做跨境电商运营,商品图片一多就容易乱:供应商发来的原图、拍摄的成片、平台下载的主图常常混在一个文件夹里,文件名又是 IMG_20261110_0931.jpg 这种毫无业务含义的格式。找一张图要翻半天,上架时还容易把 A 款的图挂到 B 款下面,白白浪费时间还可能出错。本文分享一个实用的小脚本:按款号自动归档商品图片,核心只用 Python 标准库的 os、shutil 和 pathlib,不用装任何第三方包,十几行代码就能跑起来。
一、先定规则:款号就是文件夹名
自动化之前,先把命名规则定下来,否则脚本无从下手。我们团队的约定很简单:每个款号对应一个文件夹,文件夹名就是款号,例如 SKU12345;文件夹里面再按用途分主图、细节图、白底图。文件名统一写成“款号_用途_序号.扩展名”,例如 SKU12345_主图_01.jpg。供应商发来的原始文件名五花八门,但只要文件名里包含款号,脚本就能认出来。规则定死之后,人工只需要做一件事:把待归档的图片丢进一个“待归档”文件夹,剩下的交给脚本。
二、核心思路:遍历、识别、移动
整个流程只有三步。第一步,用 pathlib 遍历“待归档”文件夹,筛出 jpg、png、webp 等图片文件,跳过表格和压缩包。第二步,从文件名里提取款号:很多供应商的文件名是“款号_描述_序号”的形式,用下划线切分,取第一段并转大写,就是款号;如果文件名里没有款号,就放进“待人工确认”文件夹,绝不乱猜。第三步,用 shutil.move 把文件移到“商品图库/款号/”下面,目标文件夹不存在就用 mkdir 自动创建。
三、可运行的完整脚本
import os, shutil
from pathlib import Path
SRC = Path("待归档")
DST = Path("商品图库")
def style_no(name: str) -> str:
# 文件名形如 "SKU12345_主图_01.jpg",取下划线前的款号
return name.split("_", 1)[0].upper()
for file in SRC.iterdir():
if not file.is_file() or file.suffix.lower() not in {".jpg", ".jpeg", ".png", ".webp"}:
continue
target_dir = DST / style_no(file.stem)
target_dir.mkdir(parents=True, exist_ok=True)
target = target_dir / file.name
if target.exists(): # 同名文件:加后缀,避免覆盖
target = target_dir / f"{file.stem}_dup{file.suffix}"
shutil.move(str(file), str(target))
print(f"已归档:{file.name} -> {target}")
print("归档完成")
运行前先在小批量图片上试一次,确认归档结果无误再全量跑。脚本只做移动,不做删除,万一规则写错,文件还在目标文件夹里,手动移回来就行。
四、两个容易踩的坑:重名与重复
第一个坑是重名。不同批次的同款主图可能都叫“SKU12345_主图_01.jpg”,直接移动会覆盖。我的做法是:目标位置已有同名文件时,在文件名后加 _dup 再移动,并打印出来,事后人工确认一次。第二个坑是内容重复:同一张图被改了个名字发了两遍,占空间还容易混淆。可以在移动前算一下文件的 MD5,把哈希值记到一个简单的文本清单里,哈希已存在就说明是重复图,跳过并记录。os 与 hashlib 都是标准库,不用额外安装。
五、再往前一步:顺手规范命名
归档的同时,还可以顺手把文件名统一改成“款号_用途_序号”的格式。做法是先按款号分好组,再按修改时间排序,依次编号。改名前先打印一份“原名 -> 新名”的对照表,确认无误再执行;也可以先用 shutil.copy 复制到新位置,确认无误后再删旧文件。等这套流程跑顺了,商品图片就从“堆在一个文件夹里”变成了“按款号随时能找到”,上架、做图、盘点都快得多。
小结:工具不需要多高级,规则清晰、流程可逆,比功能花哨更重要。os 负责遍历与判断,shutil 负责移动与复制,pathlib 让路径拼接不再出错,三个标准库组合起来,就能解决跨境电商日常运营里最磨人的图片整理问题。
- 点赞
- 收藏
- 关注作者
评论(0)