定期删除文件的Python脚本
定期手动清理文件系统是不好的。将它们自动化吧!
手动删除文件和文件夹并不是一项令人兴奋的任务,正如人们所想的那样。自动化它们是有意义的。
Python来了,让我们的生活变得更轻松。 Python是一种出色的用于编写脚本的编程语言。我们将利用Python来完成我们的任务,没有任何障碍。首先,您应该知道为什么Python 是一个好选择。
- Python是自动化任务的最爱编程语言
- 与其他编程语言相比,代码更少
- Python与所有操作系统兼容。您可以在Windows、Linux和Mac上运行相同的代码。
- Python有一个名为
os
的模块,它帮助我们与操作系统进行交互。我们将使用这个模块来完成删除文件的自动化。
我们可以使用Python替代任何烦人或重复的系统任务。如果您了解Python,为了完成特定的系统任务编写脚本就像吃蛋糕一样简单。让我们看看以下使用案例。
注:以下内容在Python 3.6+上经过测试。
删除X天前的文件/文件夹
通常,您不需要旧的日志,并且您经常需要对其进行清理以释放存储空间。它可以是任何东西,而不仅仅是日志。
我们在os
模块中有一个名为stat
的方法,该方法给出了最后访问(st_atime)、修改(st_mtime)和元数据修改(st_ctime)时间的详细信息。所有方法都以从纪元以来的秒数返回时间。您可以在此处找到有关纪元的更多详细信息。
我们将使用一个名为os.walk(path)
的方法来遍历文件夹的子文件夹。
按照以下步骤编写基于天数删除文件/文件夹的代码:
- 导入模块time、os、shutil
- 将路径和天数设置为变量
- 使用time.time()方法将天数转换为秒
- 使用os.path.exists(path)模块检查路径是否存在
- 如果路径存在,则获取路径中存在的文件和文件夹的列表,包括子文件夹。使用方法os.walk(path),它将返回一个包含文件夹、文件和子文件夹的生成器
- 使用方法os.path.join()将当前路径和文件/文件夹名称结合起来,获取文件或文件夹的路径
- 使用属性st_ctime从方法os.stat(path)获取ctime
- 将ctime与先前计算的时间进行比较
- 如果结果大于用户指定的天数,则检查它是文件还是文件夹。如果是文件,则使用
os.remove(path)
,否则使用shutil.rmtree()
方法 - 如果路径不存在,打印未找到消息
让我们详细看一下代码。
# 导入所需的模块
import os
import shutil
import time
# 主函数
def main():
# 初始化计数
deleted_folders_count = 0
deleted_files_count = 0
# 指定路径
path = “/PATH_TO_DELETE”
# 指定天数
days = 30
# 将天数转换为秒数
# time.time() 返回当前时间的秒数
seconds = time.time() – (days * 24 * 60 * 60)
# 检查文件是否存在于指定路径中
if os.path.exists(path):
# 遍历路径中的每个文件夹和文件
for root_folder, folders, files in os.walk(path):
# 比较天数
if seconds >= get_file_or_folder_age(root_folder):
# 删除文件夹
remove_folder(root_folder)
deleted_folders_count += 1 # 增加计数
# 删除根文件夹后跳出循环
break
else:
# 检查根文件夹中的文件夹
for folder in folders:
# 文件夹路径
folder_path = os.path.join(root_folder, folder)
# 与天数进行比较
if seconds >= get_file_or_folder_age(folder_path):
# 调用删除文件夹函数
remove_folder(folder_path)
deleted_folders_count += 1 # 增加计数
# 检查当前目录中的文件
for file in files:
# 文件路径
file_path = os.path.join(root_folder, file)
# 比较天数
if seconds >= get_file_or_folder_age(file_path):
# 调用删除文件函数
remove_file(file_path)
deleted_files_count += 1 # 增加计数
else:
# 如果路径不是目录
# 与天数进行比较
if seconds >= get_file_or_folder_age(path):
# 调用删除文件函数
remove_file(path)
deleted_files_count += 1 # 增加计数
else:
# 文件/文件夹未找到
print(f'”{path}” 未找到')
deleted_files_count += 1 # 增加计数
print(f”总共删除的文件夹数: {deleted_folders_count}”)
print(f”总共删除的文件数: {deleted_files_count}”)
def remove_folder(path):
# 删除文件夹
if not shutil.rmtree(path):
# 成功消息
print(f”{path} 已成功删除”)
else:
# 失败消息
print(f”无法删除 {path}”)
def remove_file(path):
# 删除文件
if not os.remove(path):
# 成功消息
print(f”{path} 已成功删除”)
else:
# 失败消息
print(f”无法删除 {path}”)
def get_file_or_folder_age(path):
# 获取文件/文件夹的创建时间
# 时间将以秒为单位
ctime = os.stat(path).st_ctime
# 返回时间
return ctime
if __name__ == ‘__main__':
main()
您需要根据需要调整上述代码中的以下两个变量。
days = 30
path = "/PATH_TO_DELETE"
删除大于X GB的文件
让我们搜索大于特定大小的文件并删除它们。这与上面的脚本类似。在前面的脚本中,我们将age作为参数,现在我们将以删除为参数采用size。
# 导入os模块
import os
# 返回文件大小的函数
def get_file_size(path):
# 获取文件的大小(以字节为单位)
size = os.path.getsize(path)
# 返回文件的大小
return size
# 删除文件的函数
def remove_file(path):
# 删除文件
if not os.remove(path):
# 成功
print(f"{path} 删除成功")
else:
# 错误
print(f"无法删除 {path}")
def main():
# 指定路径
path = "在这里输入路径"
# 设置文件的最大大小(以MB为单位)
size = 500
# 检查路径是否存在
if os.path.exists(path):
# 将大小转换为字节
size = size * 1024 * 1024
# 遍历子文件夹
for root_folder, folders, files in os.walk(path):
# 遍历文件列表
for file in files:
# 获取文件路径
file_path = os.path.join(root_folder, file)
# 检查文件大小
if get_file_size(file_path) >= size:
# 调用remove_file函数删除文件
remove_file(file_path)
else:
# 只有当路径是文件时才进行检查
if os.path.isfile(path):
# 路径不是目录
# 直接检查文件
if get_file_size(path) >= size:
# 调用remove_file函数删除文件
remove_file(path)
else:
# 路径不存在
print(f"{path} 不存在")
if __name__ == '__main__':
main()
调整以下两个变量。
path = "在这里输入路径"
size = 500
删除具有特定扩展名的文件
可能有这样一种情况,您想根据文件的扩展名来删除文件。例如 .log
文件。我们可以使用 os.path.splitext(path)
方法来获取文件的扩展名。它返回一个包含文件路径和扩展名的元组。
# 导入os模块
import os
# 主函数
def main():
# 指定路径
path = "要查找的路径"
# 指定扩展名
extension = ".log"
# 检查路径是否存在
if os.path.exists(path):
# 检查路径是否为目录
if os.path.isdir(path):
# 遍历子文件夹
for root_folder, folders, files in os.walk(path):
# 检查文件
for file in files:
# 文件路径
file_path = os.path.join(root_folder, file)
# 从文件名中提取扩展名
file_extension = os.path.splitext(file_path)[1]
# 检查文件扩展名
if extension == file_extension:
# 删除文件
if not os.remove(file_path):
# 成功消息
print(f"{file_path} 删除成功")
else:
# 失败消息
print(f"无法删除 {file_path}")
else:
# 路径不是一个目录
print(f"{path} 不是一个目录")
else:
# 路径不存在
print(f"{path} 不存在")
if __name__ == '__main__':
# 调用主函数
main()
不要忘记根据需要更新上面代码中的路径和扩展变量。
我建议在非生产环境中测试脚本。一旦满意结果,您可以通过cron(如果使用Linux)定期运行它来进行维护工作。Python非常适合完成这样的工作,如果有兴趣学习更多,请查看这个Udemy course。