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

news2025/1/7 6:26:51

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

引言

在现代数据处理和文件管理中,如何高效地管理和归档大量文件是一个常见的挑战。特别是在需要根据文件类型进行分类并定期归档的场景下,手动操作不仅耗时且容易出错。为此,我们开发了一款基于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 time


def 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.")
            break
        time.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.coloradmin.cn/o/2271297.html

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

相关文章

活动预告 | Microsoft Power Platform 在线技术公开课:实现业务流程自动化

课程介绍 参加“Microsoft Power Platform 在线技术公开课:实现业务流程自动化”活动,了解如何更高效地开展业务。参加我们举办的本次免费培训活动,了解如何借助 Microsoft AI Builder 和 Power Automate 优化工作流。结合使用这些工具可以帮…

【SpringBoot教程】搭建SpringBoot项目之编写pom.xml

🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 👏今天毛毛张分享的内容主要是Maven 中 pom 文件🆕,涵盖基本概念、标签属性、配置等内容 文章目录 1.前言🥭2.项目基本…

职场常用Excel基础04-二维表转换

大家好,今天和大家一起分享一下excel的二维表转换相关内容~ 在Excel中,二维表(也称为矩阵或表格)是一种组织数据的方式,其中数据按照行和列的格式进行排列。然而,在实际的数据分析过程中,我们常…

ASA第六天笔记

Botnet Traffic Filter简介 1.僵死网络流量过滤特性是一个基于名誉的机制,用于阻止流量源自于或者去往已知的感染主机。 2.僵死网络流量过滤比较每一个连接中的源和目的IP地址。 动态SensorBase数据库,被Cisco动态更新。静态数据库,需要手动…

【ArcGISPro/GeoScenePro】检查多光谱影像的属性并优化其外观

数据 https://arcgis.com/sharing/rest/content/items/535efce0e3a04c8790ed7cc7ea96d02d/data 操作 其他数据 检查影像的属性 熟悉检查您正在使用的栅格属性非常重要。

MySQL图形化界面工具--DataGrip

之前介绍了在命令行进行操作,但是不够直观,本次介绍图形化界面工具–DataGrip。 安装DataGrip 官网链接:官网下载链接 常规的软件安装流程。 参考链接:DataGrip安装 使用DataGrip 添加数据源: 第一次使用最下面会…

企业微信——智能表格学习

智能表格 应用限制条件 获取 token https://developer.work.weixin.qq.com/document/10013#%E5%BC%80%E5%8F%91%E6%AD%A5%E9%AA%A4 开发步骤 你可以通过以下步骤,使用access_token来访问企业微信的接口。需要注意的是,所有的接口需使用Https协议、Js…

调试:用电脑开发移动端网页,然后用手机真机调试

一、背景 电脑开发移动端,然后想真机调试... 二、实现 2.1、电脑和手机链接相同局域网 2.2、pnpm run dev 启动项目 2.3、浏览器访问 localhost:3001/login 2.4、Windowsr 输入cmd,在cmd输入 ipconfig 2.5、浏览器访问 ip地址加/login 2.6、手机端…

华为ensp-BGP路由过滤

学习新思想,争做新青年,今天学习的是BGP路由过滤 实验目的: 掌握利用BGP路由属性AS_Path进行路由过滤的方法 掌握利用BGP路由属性Community进行路由过滤的方法 掌握利用BGP路由属性Next_Hop进行路由过滤的方法 实验内容: 本实…

【书籍连载】《软件测试架构实践与精准测试》| 有关软件测试模型的调查结果

各位软件领域的精英们,今天小编邀请你继续深入学习《软件测试架构实践与精准测试》。 《软件测试架构实践与精准测试》是作者李龙(安畅检测首席技术专家)基于软件测试“川模型”的著作。本书结合作者首次提出的软件测试新的模型“川模型”测试…

nginx学习之路-windows系统安装nginx

文章目录 1. 下载2. 启动3. 验证参考文档 1. 下载 官方下载地址:https://nginx.org/en/download.html 可以下载windows版本,如nginx-1.26.2.zip。解压后,加入系统变量。 2. 启动 可以使用命令行启动(windows系统自带的cmd可能…

word中编号统一格式

不要手敲编号,要利用工具来。要善于利用多级编号和编号,分别对标题和段落进行组织 尤其是段落和标题特别多的时候,像毕设、标书这些 为什么呢?因为这样更方便修改,后续的增加和删除段落,编号会自动排列&am…

MQ-导读

什么是MQ? MQ是一款消息中间件,通常被称为"消息队列",用于分布式架构中上下文的异步通信, 由三个角色组成: 1. 消息提供者:发送消息的人 2. 消息接收者:接收、处理消息的人 3. 消息代理者&#x…

深入剖析MySQL数据库架构:核心组件、存储引擎与优化策略(四)

慢查询日志,顾名思义,就是查询慢的日志,是指mysql记录所有执行超过long_query_time(默认的时间10秒)参数设定的时间阈值的SQL语句的日志。该日志能为SQL语句的优化带来很好的帮助。默认情况下,慢查询日志是…

MySQL数据库笔记——版本号机制和CAS(Compare And Swap)

大家好,这里是Good Note,关注 公主号:Goodnote,本文详细介绍乐观锁的两种实现方式:版本号机制和CAS(Compare And Swap)。 文章目录 MySQL 内置的并发控制机制MVCC(多版本并发控制&am…

使用 commitlint 和 husky 检查提交描述是否符合规范要求

在上一小节中,我们了解了 Git hooks 的概念,那么接下来我们就使用 Git hooks 来去校验我们的提交信息。 要完成这么个目标,那么我们需要使用两个工具: 注意:npm 需要在 7.x 以上版本。 1. commitlint 用于检查提交信…

使用函数求e的近似值(PTA)C语言

自然常数e可以用级数11/1!1/2!⋯1/n!来近似计算。本题要求实现一个计算阶乘的简单函数,使得可以利用该函数,对给定的非负整数n,求该级数的前n1项和。 函数接口定义: double fact( int n ); 其中n是用户传入的参数,函…

使用Clion在ubuntu上进行交叉编译,并在Linux上远程编译五子棋

目录 1.工具以及概念介绍 (1)Clion软件简介 (2)交叉编译 (3)远程编译 2.操作原理 3.详细操作步骤 (1)配置Clion与虚拟机ubuntu的ssh连接 CLion远程开发Ubuntu,并显…

ubuntu如何禁用 Snap 更新

.禁用 Snap 更新(通过修改 snapd 配置) 打开并编辑 /etc/apt/apt.conf.d/50unattended-upgrades文件。 这个文件控制自动更新的行为。 sudo vim /etc/apt/apt.conf.d/50unattended-upgrades 里面有一行将里面的auto改为false即可禁用更新:…

SpringBoot - Spring Profiles 详解

文章目录 Pre官方文档Spring Profiles 详解1. 基本用法2. 激活 Profiles3. 添加 Active Profiles4. Profile Groups5. 在代码中设置 Profiles6. Profile 特定的配置文件 总结 Pre SpringBoot - Spring Boot 中的配置体系Profile全面解读 SpringBoot - spring.profiles.active…