学Java那几年,我养成个毛病,干什么事都想先搭架子。类怎么分、接口怎么抽、异常怎么处理,一套想下来,活儿还没干,人先累了。所以当我第一次用Python写成一个能干活的小程序时,那种感觉挺新鲜的,到现在还记得。
事情不大,就是给一批文件批量改名字。手动改也能改,就是烦,右键、重命名、输名字、回车,重复来重复去,改着改着就走神,改错一个还得回头找。我寻思这活儿让程序干算了,于是打开编辑器,敲下import os。
第一版代码很短。os.listdir()把目录里的文件列出来,循环里os.rename()挨个改。写的时候我还有点不放心,怕把文件弄坏,先拿两个文件试了试,跑通了,才放开手干。看着文件名一个个变成我想要的格式,那种感觉怎么说呢——不是多大的成就,但就是舒坦。就像家里有个抽屉一直乱着,你顺手把它理整齐了,关上抽屉那一下,心里特别顺。
不过第一版跑完,我盯着结果看了看,发现不对。os.listdir()返回的顺序不固定,改出来的序号跟原来的先后对不上。代码是跑通了,逻辑没想周全。于是回头改,加上os.path.getmtime(),先按修改时间排个序,再挨个编号。这回跑完,顺序顺了,从头到尾对得上。
改到这儿我又想起个隐患:万一新名字跟目录里已有的文件撞了怎么办?os.rename()可不管这个,直接覆盖,连个招呼都不打。于是我加了个判断,目标文件名存在就跳过,另起个名字。顺手还加了个”预演”的开关,跑之前先把新旧文件名打印出来看一眼,确认没问题再真动手。这习惯后来帮了我大忙,有次规则写岔了,预演一跑满屏都是覆盖提示,我赶紧停手,没造成损失。
后来我把os.path那套换成了pathlib,纯粹是图清爽。以前os.path.join()、os.path.splitext()括号套括号,看久了眼晕。pathlib直接Path("目录").iterdir()遍历,.stem拿文件名、.suffix拿扩展名,链式点下来,读着跟说话似的。改完这一版,代码短了一截,我自己回头读都觉得舒服。
最后我给它加了个日志,每改一个文件就往txt里记一行”原名 -> 新名”。这招是跟Java项目里的事务日志学的,虽然改个文件名没那么严肃,但留条后路,心里踏实。
全部弄完,我把这个小程序存了下来,起了个名字叫rename_tool.py。它不大,一百来行,但该有的都有:排序、防覆盖、预演、日志。后来我又往里加了几个功能,比如按扩展名筛选、支持正则替换,都是用到的时候顺手补的。
那天下午我坐在电脑前,看着这个自己一点点攒出来的小工具,心里挺高兴的。不是因为它多厉害,而是它完整——从想法到代码到跑通,全是我自己弄的,中间踩的坑也全是我自己填的。Java教会我做事要有章法,Python让我发现,章法之外还有”顺手”这回事。一个下午,一百来行代码,攒出个自己用得上的小东西,非常有趣!