定期删除文件的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

类似文章