Python脚本实现根据文件扩展名进行文件自动分类
试想一下,有没那么一天,你刚刚结束工作,重新切回电脑桌面上。文档、图片、音频、视频等各种格式的文件都堆满了桌面,想要从桌面找到某个文件,就像从蛋炒饭里将所有葱花挑出来一样困难。
对于这种情况,我们可以按照文件扩展名,或其他的分类方式,分门别类的将文件整理到不同的目录。方法虽然找到了,但是手动操作起来的也是很不容易的。
所以,我们今天就一起来学习一下,怎么用 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使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解,需要的朋友可以参考下2020-02-02


最新评论