适 用 专 业
适用于所有专业。
实 验 目 的
(1)熟练运用标准库os和os.path中的函数。 (2)理解sys库中argv成员的用法。 (3)理解Python程序接收命令行参数的方式。 (4)理解递归遍历目录树的原理。 (5)了解从命令提示符环境运行Python程序的方式。
实 验 内 容
编写程序,实现磁盘垃圾文件清理功能。要求程序运行时,通过命令行参数指定要清理的文件夹,然后删除该文件夹及其子文件夹中所有扩展名为tmp、log、obj、txt以及大小为0的文件。
代码
测试代码:
import os
os.chdir("cleartest")
f = open('zero.doc', "w")
f.close()
list_file = ['tmp', 'log', 'obj', 'txt']
for i in list_file:
filename = "{0}file.{0}".format(i)
f = open(filename, "w")
f.write("写一些东西不至于0KB")
f.close()
磁盘清理程序:
import re,os
import sys
position = sys.argv[1]
def find_file(directory, depth=-1, re_pattern=None, onerror=print) -> list:
"""
查找文件,并进行筛选。
- `directory`:目标目录。
- `depth`: 查找文件树的最大深度。如果值为负数,则无限深度。
- `re_pattern`: 根据正则表达式筛选文件名。
- `onerror`: 一个可调用的参数,用于记录报错。
"""
if not os.path.isdir(directory):
raise ValueError("{} 文件夹路径不存在".format(directory))
try:
file_list = os.listdir(directory)
except PermissionError as e:
onerror("您没有打开{}的权限".format(e))
return -1
path_list = []
for filename in file_list:
path = os.path.join(directory, filename)
if os.path.getsize(path) == 0:
os.remove(path)
print("已删除大小为 0 的{}".format(path))
if depth != 0 and os.path.isdir(path):
sub_list = find_file(path, depth - 1, re_pattern, onerror)
if sub_list != -1:
path_list.extend(sub_list)
continue
if re_pattern and not re.findall(re_pattern, filename):
continue
path_list.append(path)
return path_list
for i in find_file(directory=position, re_pattern='.*.tmp|.*.obj|.*.txt|.*.log'):
os.remove(i)
print("已删除{}类型文件{}".format(i[-3:],i))
运行结果
命令行运行
D:\Desktop\PyCharmWork\Demo\work-7-2022-04-15>python main.py cleartest
已删除大小为 0 的cleartest\zero.doc
已删除log类型文件cleartest\logfile.log
已删除obj类型文件cleartest\objfile.obj
已删除tmp类型文件cleartest\tmpfile.tmp
已删除txt类型文件cleartest\txtfile.txt
参考资料
【1】(101条消息) Python 磁盘垃圾文件清理器_SK Primin的博客-CSDN博客
|