试想一下,有没那么一天,你刚刚结束工作,重新切回电脑桌面上。文档、图片、音频、视频等各种格式的文件都堆满了桌面,想要从桌面找到某个文件,就像从蛋炒饭里将所有葱花挑出来一样困难。
对于这种情况,我们可以按照文件扩展名,或其他的分类方式,分门别类的将文件整理到不同的目录。方法虽然找到了,但是手动操作起来的也是很不容易的。
所以,我们今天就一起来学习一下,怎么用 Python 脚本,根据文件扩展名自动的将文件进行分类。
核心思路
实现自动的文件分类功能,核心有两个问题:如何定义分类规则?如何执行流程?
1、设计分类规则
首先,我们要根据文件扩展名,把文件放到指定的目录下。这样的话,我们就需要建议一个目录和扩展名的映射关系。
我们使用“字典”作为核心的数据结构。其中,目录名为键,扩展名的列表为值。
{
"music": ("mp3", "wav"),
"movie": ("mp4", "rmvb", "rm", "avi"),
"execute": ("exe", "bat")
}
2、设计执行流程
在这个业务场景下,“文件遍历”和“文件处理”是两个可以分离的步骤,但存在速度不匹配的依赖关系。所以,这里我们借鉴“生产者-消费者”这一经典的设计模式。
“生产者”负责遍历目录下的文件,并将文件信息放入队列。
“消费者”负责从队列中取出文件,并根据规则将其移动到正确文件夹。
“队列”作为生产者和消费者之间的缓冲区域,解耦两个过程,避免相互等待。
“生产者-消费者”模式的优势:
1. 如果生产者快,数据可暂存于队列,生产者无需等待。
2. 如果消费者快,队列空时消费者会等待,直至新数据到来。
3. 平衡了双方速度差异,提高程序整体健壮性。
代码实现
整个程序主要由以下几个函数构成:
1、创建分类目录
根据分类规则字典,在指定目录下提前创建好分类目录。
实现代码如下:
def make_new_dir(root_dir: Path, dir_names: Iterable):
for dir_name in dir_names:
target_dir = root_dir / dir_name
# mkdir 的 exist_ok=True 参数会避免目录已存在的错误
target_dir.mkdir(exist_ok=True)
上面代码中,root_dir: Path 参数是一个根路径,dir_names: Iterable 参数是一个分类目录集合。
2、生产者:遍历目录并写入队列
使用 root_dir.iterdir() 方法遍历源目录,将每个子文件存入队列。
实现代码如下:
def write_to_q(root_dir: Path, q: Queue):
for file_path in root_dir.iterdir():
if file_path.is_file():
print(f"write_to_q... Adding {file_path.resolve()}")
q.put(file_path.resolve())
3、消费者:获取队列中的文件信息,并移动文件
从队列中取出数据,解析出文件路径,然后调用函数进行处理。
实现代码如下:
def classify_from_q(q: Queue, type_to_classify: dict):
dir_map = build_extension_to_dir(type_to_classify)
print(f"classify_from_q... Starting... with a total of {q.qsize()} files.")
while not q.empty():
filepath: Path = q.get()
print(f"classify_from_q... Getting {filepath}")
file_suffix = filepath.suffix.lstrip(".")
dir_name = dir_map.get(file_suffix)
if dir_name:
target_filepath = filepath.parent / dir_name / filepath.name
move_new_dir(filepath, target_filepath)
# 休息一下
sleep(0.5)
def move_new_dir(source_filepath: Path, target_filepath: Path):
# 确保目标目录存在
target_filepath.parent.mkdir(parents=True, exist_ok=True)
# 移动文件
source_filepath.rename(target_filepath)
print(f"move_new_dir... File moved successfully... {source_filepath} --> {target_filepath}")
def build_extension_to_dir(file_types: dict):
extension_to_dir = {}
for dir_name, extensions in file_types.items():
for ext in extensions:
extension_to_dir[ext] = dir_name
print(f"build_extension_to_dir... {extension_to_dir}")
return extension_to_dir
classify_from_q 函数消费队列中的文件信息,并构建执行流程。
move_new_dir 函数实现了文件移动功能。
build_extension_to_dir 函数实现了反向字典查找功能,构建一个根据扩展名查询分类目录的字典。
# 构建字典
file_types = {
"music": ("mp3", "wav"),
"movie": ("mp4", "rmvb", "rm", "avi"),
"execute": ("exe", "bat")
}
# 构建出的反向查找字典
{
'mp3': 'music',
'wav': 'music',
'mp4': 'movie',
'rmvb': 'movie',
'rm': 'movie',
'avi': 'movie',
'exe': 'execute',
'bat': 'execute'
}
总结
今天,我们不仅学会了一个自动整理文件的Python脚本,更体验了如何用编程思维解决实际问题。
面对复杂任务时, “拆分功能” 和 “模式复用” 是关键一步。通过函数封装每个步骤,再借助经典的生产者-消费者模式组合流程,代码变得清晰、健壮,更容易应对未来更复杂的需求。
这才是高效办公的真谛:不是拼命手动操作,而是让机器自动工作,把精力留给真正重要的思考。
-------- 写在最后 --------
希望这篇教程能让你感受到用 Python 实现文件/目录管理的魅力!
从繁琐的人工操作到高效的自动化处理,你只花了短短几分钟。
如果你想获得本文的完整代码,请在评论区回复 【一起来学Python】 。
点赞 :如果觉得有收获,点个赞支持一下吧!
分享 :分享给身边同样对 Python 感兴趣的朋友!
关注 :不错过每一篇 Python 实战干货!
每周更新 Python 自动化办公、Web 开发、算法等硬核技巧,助你成为 10 倍效率的开发者!
#Python #目录管理 #文本分类 #自动化办公 #Python实战