os &
你是否发现自己的下载文件夹里已经到处都是 PDF、图片、视频、安装包以及压缩包? 这些文件堆积在一起, 混乱的程度简直就和垃圾场没有区别。因此, 你每次想要找到一个具体的文件时, 都不得不花费大量的时间来进行翻阅和寻找。
你先别着急, 因为操作系统自带的功能里面已经包括了相关库,所以你完全不需要再安装任何额外的第三方库。接下来你只需要把下方的 10 行代码拷贝走, 仅仅需要花费 1 分钟的时间, 下载文件夹里的文件就能够按照要求被自动整理归类了。
import os, shutil # 系统工具箱 + 文件搬运工DOWN = r"C:\Users\你\Downloads" # 下载文件夹路径(改成你的)
EXT = {".jpg": "图片", ".png": "图片", ".pdf": "文档", ".docx": "文档", # 扩展名 -> 目标文件夹
".zip": "压缩包", ".exe": "安装包", ".mp4": "视频", ".txt": "文档"}
for f in os.listdir(DOWN): # 遍历下载文件夹里每个文件
ext = os.path.splitext(f)[1].lower() # 取出扩展名,统一转小写
folder = EXT.get(ext, "其他") # 查字典,没匹配到的归"其他"
os.makedirs(f"{DOWN}\\{folder}", exist_ok=True) # 建对应文件夹
shutil.move(f"{DOWN}\\{f}", f"{DOWN}\\{folder}\\{f}") # 搬进去
这就算是把全部的事情都讲完了。总共只用到了 10 行代码, 从头到尾包括了对文件进行遍历的操作, 以及把东西搬运并放到正确位置的操作, 全都是这一点点代码包揽了的。接下来呢, 咱们可以使用下面的这 3 张图片来看看它到底能够为你做哪些事情。
在整理之前的情况跟整理以后的情况做个对比来看, 只需要用3张图就能看清楚两者之间的具体差距。
图 1(整理前): 八种不同类型的文件, 被大家混合在一起, 弄得一团糟。
这事情其实就是我自己在上个月的那一个月里面的下载文件夹, 这个文件夹里面有PDF格式的文件, 有图片这种文件, 有视频这种文件, 有安装包这种文件, 有压缩包这种文件, 有Word格式的文件, 有TXT格式的文件, 它们全部全部都乱七八糟地堆结在了一块儿, 你要想找个文件的话得瞪大了眼睛去翻找那好长好长时间。
如果你想想看用手来手动整理呢? 你得先新建出五个文件夹出来, 然后再把总共八个文件一个接一个地都拖动到里面去, 光是做分类这一件事情就把人给烦死了。
图 2, 也就是那个运行过程的展示, 可以看到一行接着一行的搬运日志正在出现, 整个过程仅仅耗费了 0.08 秒的时间, 所有数据就完成了全部归位的操作。
现在就把上面提到的那10行代码保存为扩展名为py的文件, 然后把里面的路径修改成你自己计算机上指定的文件下载地址, 接着直接双击这个文件运行就可以。你认真看一下这个表现, 整个过程只用了0.08秒的时间, 之前找不到的8个文件就已经全部都被整理到了属于它们各自的文件夹里面去。
即便未来你的整个文件夹里面的文件数量非常多, 多到让你感到头痛, 那么它处理这些文件的整体速度, 依然会保持在这个固定的水平上面, 不会有任何的减慢发生。
图3(整理后), 只剩下一些文件夹分类, 找东西能够一眼锁定。
整理工作完成之后, 在下载的文件夹里面, 就只剩下像图片、文档、压缩包、安装包还有视频这样的几个分类文件夹了。
如果将来还需要寻找文件的话, 那么就应该先按照具体的类型进入到对应的文件夹里面去, 这样的话, 一眼就可以锁定目标。对于那些新下载的文件, 我们也可以再次运行刚才的流程, 让它们自动归位到合适的位置。
把内容拆开来看, 一共有四个重点部分, 用三十秒就能快速过完。
假如说你想要抄作业的话, 上面提供的这一段代码已经能够直接运行了。假如说你希望能够搞懂其背后的原理的话, 下面将会把这四个关键点逐一拆开来进行详细的讲述。
这个函数调用的作用是, 把存放在文件夹里面的所有文件的名称, 全部给一个个地列出来。
所谓的列目录, 意思是指把那个文件夹里面的所有文件, 还有那些子文件夹的名字, 一次性地罗列出来, 形成一张清单。只有拿到了这张清单, 你才能够一个一个地对它们进行后续处理。
import osfiles = os.listdir(r"C:\Users\你\Downloads") # 列出文件夹里所有名字
print(files)
# ['年终总结报告.pdf', '产品图_001.jpg', ...]
② os.path.( ): 这个操作的意思就是, 硬是要把那个文件名还有它的扩展名给一下子彻底分割开来。
所谓“劈扩展名”, 这个说法的意思, 就是在文件名的最后一个点的位置处, 把文件名分成前后两部分, 前面的那一部分被认定为名字, 也就是产品图_001这一个标识, 后面的那一部分则变成扩展名, 即.jpg这一项内容, 当获得了扩展名之后, 就能够搞清楚这个文件究竟属于哪一个类型了。
import osname, ext = os.path.splitext("产品图_001.jpg") # 一刀切开
print(name) # 产品图_001
print(ext) # .jpg(带点)
第三项, .get 这个方法后面跟着括号, 括号里先写ext然后逗号再写其他, 这个动作相当于去查一本字典, 如果字典里面没有相应的记录, 那么就会提供一个预设好的默认值。
所谓 get 这个词, 其实指的就是查字典这个动作。拿文件的扩展名去字典里面查找它应该归类到哪一个名下。一旦查到了, 就去取对应的那个值。
如果没查到, 就直接返回其他的处理结果。采用这样的方式, 不管下载了什么奇怪的格式类型文件, 全都一个都不会漏掉。最终所有情况都会统一地归类到其他所在的文件夹当中。
EXT = {".jpg": "图片", ".pdf": "文档"}print(EXT.get(".jpg", "其他")) # 图片(命中了)
print(EXT.get(".mp4", "其他")) # 其他(没命中,给默认值)
④ .move()这个操作的作用, 是把某个文件从原本所在的那个旧的地方挪动一下, 让它去到那个新的地方。
move 这个操作的意思就是搬运, 也就是要把文件从它本来所处的一个旧位置, 移到那个指定的目标文件夹里面去的一个动作, 这里边一定要注意的是, 它就是只属于移动的范畴, 完全不属于复制的范围, 一旦完成了这一通搬行动作之后呢, 原来存放文件的那个地方就不再多留有任何副本或者痕迹了, 这样一来, 整个文件夹自然也就变得干净清爽了。
import shutilshutil.move(r"旧位置\产品图.jpg", r"图片\产品图.jpg")
# 把文件从旧位置搬到新位置(移动,不是复制)
你要是能把这四点给看明白了, 那么这一整套逻辑其实就全都弄通透了。具体是怎么做到的呢? 就是先把东西列成一个单子, 然后去找到那个扩展名是什么, 接着再去查查它到底属于哪一类分类, 最后再把它搬过来放到该放的地方去归位。
写在最后
这一系列手段的中心思想, 实际上并不是指要去专门学习操作系统这些内容。它的真实意图在于将过去那种需要人工手动把文件拖拽来拖拽去的繁琐过程。
彻底替换成依据预先设定好的规则, 让文件能够按照逻辑进行自动归位的机制。对于那些像下载文件夹这样每天都在不断堆积资料、每天都处于混乱无序状态的存储区域。是最适合交由专门的程序系统进行统一管理和处理的。
建议你先收藏加关注, 这样在下次整理文件的时候又找不到。
这行内容里头的字, 就是破折号, 它们在这里排了好多列。
你在工作的过程中, 最想使用什么样的方法来让工作效率变高, 你可以想一想。比如说是批量生成二维码, 又或者是自动整理Excel文件, 再来就是一场邮件一键发送之类的情况, 你都可以在评论区里面把这个想法告诉我。
那个被点赞数排到第一名的人想要的功能, 我们在下一期的内容里会直接把对应的教程给大家做出来。