本系列文章配套代码获取有以下两种途径:
-
通过百度网盘获取:
链接:https://pan.baidu.com/s/1i9F6oV1J5oZnIsOASDs0gQ?pwd=mnsj
提取码:mnsj
-
前往GitHub获取:
https://github.com/returu/Python_mini_program
脚本需求:
实现步骤:
-
持续监控目录:通过while True无限循环实现。 -
生成压缩文件:通过zipfile模块实现。 -
删除文件——使用内置模块os来实现。
代码实现:
# 导入os模块,用于文件和目录操作
import os
# 导入zipfile模块,用于创建和操作zip文件
import zipfile
# 导入time模块,用于在循环中引入延时
import time
def monitor_and_zip(directory, output_directory, archive_prefix="archive"):
"""
监控指定目录中的文件,当文件数量达到或超过5个时,
将这些文件压缩到一个zip文件中,并删除原文件。
压缩文件以指定的前缀和递增的数字命名,存储在输出目录中。
参数:
directory (str): 要监控的目录路径。
output_directory (str): 存储压缩文件的输出目录路径。
archive_prefix (str, 可选): 压缩文件的前缀名,默认为"archive"。
"""
archive_number = 1 # 初始化压缩文件的编号
while True: # 无限循环,持续监控目录
# 使用列表推导式获取指定目录中的所有文件,排除子目录
files = [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]
# 如果文件数量达到或超过5个
if len(files) >= 5:
# 如果输出目录不存在,则创建它
if not os.path.exists(output_directory):
os.makedirs(output_directory)
# 构建压缩文件的名称
archive_name = f"{archive_prefix}_{archive_number}.zip"
zip_path = os.path.join(output_directory, archive_name)
# 使用with语句创建zip文件,确保文件正确关闭
with zipfile.ZipFile(zip_path, 'w') as zipf:
for file in files:
file_path = os.path.join(directory, file)
# 将文件添加到zip文件中,保持原文件名
zipf.write(file_path, arcname=file)
# 删除原文件
os.remove(file_path)
print(f"Deleted {file_path}") # 打印已删除的文件路径
# 打印创建的压缩文件路径和包含的文件数量
print(f"Created archive {zip_path} with {len(files)} files.")
# 重置文件列表,为下一次循环做准备
files = []
# 增加压缩文件的编号,以便下一次压缩时生成不同的文件名
archive_number += 1
# 检查用户是否想要停止程序
# 在每次循环结束后,程序会提示用户输入,如果用户输入'q',则程序会停止并输出提示信息。
# 如果用户输入任何其他键,程序将继续运行
# user_input = input("Press 'q' to quit, any other key to continue: ") # 等待用户输入
# if user_input.lower() == 'q': # 如果用户输入'q',则停止程序
# print("Program stopped by user.")
# break # 退出循环,结束程序
# 等待5秒,然后再次检查目录中的文件
time.sleep(5)
# 设置要监控的目录和输出目录的路径
monitor_directory = "./files" # 监控的目录
output_directory = "./output" # 存储压缩文件的目录
# 调用monitor_and_zip函数,开始监控和压缩过程
monitor_and_zip(monitor_directory, output_directory)


本篇文章来源于微信公众号: 码农设计师