自动化文件监控与分类压缩:实现高效文件管理

自动化文件监控与分类压缩:实现高效文件管理

引言

在现代数据处理和文件管理中,如何高效地管理和归档大量文件是一个常见的挑战。特别是在需要根据文件类型进行分类并定期归档的场景下,手动操作不仅耗时且容易出错。为此,我们开发了一款基于Python的自动化工具,能够实时监控指定目录中的文件,并根据文件类型自动进行压缩归档。本文将详细介绍该工具的功能、实现原理及其应用场景。

功能概述

该工具的主要功能包括:

  1. 实时监控:持续监控指定目录中的文件变化。
  2. 按类型分组:根据文件扩展名对文件进行分类。
  3. 自动压缩:当某一类型的文件数量超过设定阈值(默认为5个)时,自动生成压缩包并将其移动到指定的输出目录。
  4. 删除原文件:为节省空间,压缩后的原文件会被删除。
  5. 用户交互:提供简单的用户交互界面,允许用户随时停止监控。
实现原理
1. 目录创建与初始化

首先,确保输出目录存在。如果不存在,则自动创建该目录。这一步骤保证了后续压缩包有地方存放。

if not os.path.exists(output_directory):os.makedirs(output_directory)print(f"Output directory '{output_directory}' created.")
2. 文件监控与分类

通过os.listdir()获取指定目录下的所有文件,并使用os.path.splitext()分离文件名和扩展名。然后,将相同扩展名的文件归为一组,存储在一个字典中,以便后续处理。

files = [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]
file_groups = {}
for file in files:_, ext = os.path.splitext(file)ext = ext.lower()if ext in file_groups:file_groups[ext].append(file)else:file_groups[ext] = [file]
3. 压缩归档

对于每种类型的文件,当其数量超过5个时,生成一个以当前时间戳命名的压缩包,并将这些文件添加到压缩包中。同时,删除已压缩的原文件以释放空间。

for ext, group in file_groups.items():if len(group) > 5:archive_date_num = datetime.datetime.now().strftime("%Y%m%d_%H:%M:%S")archive_prefix = ext.strip('.')archive_name = f"{archive_prefix}_{archive_date_num}.zip"zip_path = os.path.join(output_directory, archive_name)with zipfile.ZipFile(zip_path, 'w') as zipf:for file in group:file_path = os.path.join(directory, file)try:zipf.write(file_path, arcname=file)os.remove(file_path)print(f"Deleted {file_path}")except Exception as e:print(f"Failed to delete {file_path}: {e}")print(f"Created archive {zip_path} with {len(group)} files.")
4. 用户交互与循环监控

程序会每隔5秒检查一次文件变化,并询问用户是否继续监控。用户可以输入q来退出程序。

user_input = input("Press 'q' to quit, any other key to continue: ")
if user_input.lower() == 'q':print("Program stopped by user.")break
time.sleep(5)
应用场景
  1. 日志文件管理:对于生成大量日志文件的应用,可以定期压缩旧日志,防止磁盘空间被占用。
  2. 图片或文档库:在图片或文档库中,可以根据文件类型自动整理和归档,方便日后查找和管理。
  3. 临时文件清理:对于频繁生成临时文件的环境,可以自动清理不再需要的文件,保持系统整洁。
完整源码
import os
import datetime
import zipfile
import timedef monitor_and_zip_by_type(directory, output_directory):# 确保输出目录存在if not os.path.exists(output_directory):os.makedirs(output_directory)  # 创建输出目录print(f"Output directory '{output_directory}' created.")while True:try:# 获取指定目录下所有文件files = [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]file_groups = {}  # 用于存放不同类型文件的字典# 将文件按扩展名分组for file in files:_, ext = os.path.splitext(file)  # 分离文件扩展名ext = ext.lower()  # 转换为小写以统一处理if ext in file_groups:file_groups[ext].append(file)  # 添加到对应扩展名的列表中else:file_groups[ext] = [file]  # 创建新的扩展名列表# 遍历每种文件类型及其文件列表for ext, group in file_groups.items():if len(group) > 5:  # 如果同类型文件数量超过5个# 获取当前时间作为压缩包的日期标识archive_date_num = datetime.datetime.now().strftime("%Y%m%d_%H:%M:%S")archive_prefix = ext.strip('.')  # 使用文件类型作为压缩包前缀archive_name = f"{archive_prefix}_{archive_date_num}.zip"  # 生成压缩包名称zip_path = os.path.join(output_directory, archive_name)  # 压缩包完整路径# 创建压缩包并写入文件with zipfile.ZipFile(zip_path, 'w') as zipf:for file in group:file_path = os.path.join(directory, file)  # 获取文件完整路径try:zipf.write(file_path, arcname=file)  # 写入文件到压缩包os.remove(file_path)  # 删除已压缩的原文件print(f"Deleted {file_path}")  # 输出删除文件的信息except Exception as e:print(f"Failed to delete {file_path}: {e}")  # 捕获删除失败的异常print(f"Created archive {zip_path} with {len(group)} files.")  # 输出压缩结果信息except Exception as e:print(f"An error occurred: {e}")  # 捕获并输出其他异常# 用户输入决定是否继续监控user_input = input("Press 'q' to quit, any other key to continue: ")if user_input.lower() == 'q':  # 如果用户输入'q'则退出print("Program stopped by user.")breaktime.sleep(5)  # 暂停5秒后继续监控# 获取用户输入的监控目录和输出目录
monitor_directory = input('请输入监控的目录:').strip()
if not monitor_directory:  # 如果未输入,则使用当前工作目录monitor_directory = os.getcwd()output_directory = input('请输入压缩文件的目录:').strip()
if not output_directory:  # 如果未输入,则使用当前工作目录output_directory = os.getcwd()# 启动监控和压缩功能
monitor_and_zip_by_type(monitor_directory, output_directory)
结论

通过上述工具,我们可以轻松实现文件的自动化监控与分类压缩,极大地提高了文件管理的效率和准确性。无论是个人用户还是企业级应用,都可以从中受益。未来,还可以进一步优化此工具,例如增加更多的配置选项、支持多线程处理等,以满足更多复杂的需求。


希望这篇文章能帮助你更好地理解这个工具的功能和应用场景。如果有任何问题或改进建议,欢迎随时交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/65018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小红书怎么看ip所属地?小红书ip属地为什么可以变

小红书,作为当下热门的社交电商平台,不仅为用户提供了丰富的购物与分享体验,还通过展示用户IP属地信息,增强了网络社交的透明度和真实性。然而,不少用户发现,小红书上的IP属地并非一成不变,这引…

springboot使用hutool captcha +vue实现图形验证码

一、效果 使用hutool captcha实现简单的图形验证码&#xff0c;可以参考官网概述 | Hutool 二、实现步骤 1、导入依赖 <!--hutool包--> <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.…

2501d,d的优势之一与C互操作

原文 如前,我已将个人理财包从C移植到D语言,开始时,把里面的一些移植到Rust中,直到我再也受不了了. D和Rust版本中都有读取从美国运通下载的.csv文件的工具之一,并把交易加载到包含财务数据的轻查数据库中,试通过使用基于李文距离的算法的模糊比较问题的描述与现有问题,来为每…

vue3+Echarts+ts实现甘特图

项目场景&#xff1a; vue3Echartsts实现甘特图;发布任务 代码实现 封装ganttEcharts.vue <template><!-- Echarts 甘特图 --><div ref"progressChart" class"w100 h100"></div> </template> <script lang"ts&qu…

EdgeX规则引擎eKuiper

EdgeX 规则引擎eKuiper 一、架构设计 LF Edge eKuiper 是物联网数据分析和流式计算引擎。它是一个通用的边缘计算服务或中间件,为资源有限的边缘网关或设备而设计。 eKuiper 采用 Go 语言编写,其架构如下图所示: eKuiper 是 Golang 实现的轻量级物联网边缘分析、流式处理开源…

【AIGC-ChatGPT进阶提示词指令】AI美食助手的设计与实现:Lisp风格系统提示词分析

引言 在人工智能助手的应用领域中&#xff0c;美食烹饪是一个既专业又贴近生活的方向。本文将详细分析一个基于Lisp风格编写的美食助手系统提示词&#xff0c;探讨其结构设计、功能实现以及实际应用效果。 提出你的菜系&#xff0c;为你分析&#xff0c;并生成图片卡片 提示词…

智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之9 重新开始 之2

本文要点 对程序设计而言&#xff1a;前者基于一个自上而下的 分类体系--&#xff08;生物遗传基因&#xff09;&#xff0c;后者者需要一个收集差异的自下而上的差异继承路径--&#xff08;系统继承源流&#xff09; 就是 广义和狭义 分类学。 共性对齐 和 差异收集 正是两者…

MCA:用于图像识别的深度卷积神经网络中的多维协同注意力

摘要 大量先前的研究已经表明,注意力机制在提高深度卷积神经网络(CNNs)性能方面具有巨大潜力。然而,现有的大多数方法要么忽略了在通道和空间维度上同时建模注意力,要么引入了更高的模型复杂度和更重的计算负担。为了缓解这一困境,本文提出了一种轻量级且高效的多维协同…

halcon中图像处理及图像滤波

图像滤波简介 图像滤波的方法主要分为两大类:空间域方法和频域方法。 空间域方法是以对图像的像素直接进行处理为基础,包括均值滤波、中值滤波、高斯滤波等;频域方法则是以修改图像在傅里叶变换空间的值为基础的,包括高通滤波、低通滤波、同态滤波等。 1.空间域图像滤波 图…

【从零开始入门unity游戏开发之——C#篇42】C#补充知识——随机数(Random)、多种方法实现string字符串拼接、语句的简写

文章目录 一、随机数1、Random.Next()生成随机整数示例&#xff1a;生成一个随机整数生成指定范围内的随机整数 2、Random.NextSingle生成随机浮点数示例&#xff1a;生成随机浮点数 3、 生成随机字母或字符示例&#xff1a;生成随机字母示例&#xff1a;生成随机小写字母 二、…

吐卡机开发——指令合集—未来之窗行业应用跨平台架构

序号指令10A 09 02 01 01 0D DE20A 09 02 02 01 FD DE30A 09 02 03 01 6D DF40A 09 02 04 01 5D DD50A 09 02 05 01 CD DC60A 09 02 06 01 3D DC70A 09 02 07 01 AD DD80A 09 02 08 01 5D D890A 09 02 09 01 CD D9100A 09 02 10 01 5D D2110A 09 02 11 01 CD D3120A 09 02 12 0…

fpga系列 HDL:verilog 常见错误与注意事项 位宽不匹配+case 语句中没有覆盖所有情况

位宽不匹配问题 信号或操作数的位宽不匹配&#xff0c;可能导致仿真或综合错误。 module top (input wire [3:0] a,output wire [7:0] b );assign b a; endmodulecase 语句中没有覆盖所有情况 module top (input wire [1:0] sel,input wire [7:0] a,input wire [7:0] b,in…

Linux中操作中的无痕命令history技巧

当我们需要查看Linux下的操作记录时&#xff0c;就可以用history命令来查看历史记录 1、关闭history记录功能&#xff0c;如果不想让别人看到自己在Linux上的操作命令&#xff0c;可以用这个命令 set o history 2、打开history记录功能 set -o history3、清空记录 histor…

计算机网络练习题

学习这么多啦&#xff0c;那就简单写几个选择题巩固一下吧&#xff01; 1. 在IPv4分组各字段中&#xff0c;以下最适合携带隐藏信息的是&#xff08;D&#xff09; A、源IP地址 B、版本 C、TTL D、标识 2. OSI 参考模型中&#xff0c;数据链路层的主要功能是&#xff08;…

优化租赁小程序提升服务效率与用户体验的策略与实践

内容概要 在这个快速发展的商业环境中&#xff0c;租赁小程序成为了提升服务效率和用户体验的重要工具。通过对用户需求的深入挖掘&#xff0c;我们发现他们对于功能的便捷性、响应速度和界面的友好性有着极高的期待。因此&#xff0c;针对这些需求&#xff0c;完善租赁小程序…

【数据结构】树链刨分

1 u v k&#xff0c;修改路径上节点权值&#xff0c;将节点 uu 和节点 vv 之间路径上的所有节点&#xff08;包括这两个节点&#xff09;的权值增加 kk。2 u k&#xff0c;修改子树上节点权值&#xff0c;将以节点 uu 为根的子树上的所有节点的权值增加 kk。3 u v&#xff0c;询…

pandas.Grouper() 在实际项目中非常有用,尤其是在处理时间序列数据、财务数据或多级索引数据时

pandas.Grouper() 在实际项目中非常有用&#xff0c;尤其是在处理时间序列数据、财务数据或多级索引数据时。以下是几个实际场景的例子&#xff0c;展示了如何使用 pandas.Grouper() 进行数据分组&#xff0c;并用数值示例说明。 1. 按月分组进行销售数据汇总 场景&#xff1…

private static final Logger log = LoggerFactory.getLogger()和@Slf4j的区别

一、代码方面 - private static final Logger log LoggerFactory.getLogger()方式 详细解释 这是一种传统的获取日志记录器&#xff08;Logger&#xff09;的方式。LoggerFactory是日志框架&#xff08;如 Log4j、Logback 等&#xff09;提供的工厂类&#xff0c;用于创建Lo…

医疗数仓Hive安装部署

Hive安装部署 Hive安装部署 1&#xff09;把hive-3.1.3.tar.gz上传到linux的/opt/software目录下 2&#xff09;解压hive-3.1.3.tar.gz到/opt/module/目录下面 [atguiguhadoop102 software]$ tar -zxvf /opt/software/hive-3.1.3.tar.gz -C /opt/module/3&#xff09;修改hive…

通俗易懂的讲一下Vue的双向绑定和React的单向绑定

1.Vue 的双向绑定&#xff1a; <template><!-- 输入框和数据自动绑定&#xff0c;就像连体婴儿&#xff0c;一个动另一个也动 --><input v-model"message"><p>{{ message }}</p><!-- 完整表单示例 --><form><!-- 所有…