扫描过程
代码用之前,要修改一下变量 folder 指向的扫描目录,
执行的时候,会在终端显示当前目录下的一级目录的大小和文件数,
会根据阈值设置,将扫描结果生成两个报告文件(csv格式),可以直接用 Excel 打开。
程序只是扫描,不会对文件进行任何操作。
如果你的电脑环境,已经将 .py 文件关联上 python ,可以直接双击 scan_disk.py 执行,
否则要在终端执行:
python scan_disk.py
完整代码如下,只调用了 python 的标准库。
import os,time,sys,traceback
folder = r'c:/windows' # 要扫描的目录
folder_threshold = 1000 # 扫描目录阈值,单位 M
file_threshold = 100 # 扫描文件阈值
M_SIZE = 1024*1024 # 1M 的字节数
display_level = 1 # 在终端上显示目录的层级,设大了显示比较乱
file_rpt_name = '扫描文件报告.csv' # 最后生成的报告文件名
folder_rpt_name = '扫描目录报告.csv'
dirinfos = []
fileinfos = []
def format_time(t):
'''格式化时间'''
return time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(t))
def my_rjust(width,st):
'''格式化字符串到指定长度,解决汉字问题'''
w = width - (len(st.encode('utf-8')) - len(st))//2
return st.ljust(w,' ')
def scan_dir(dir,level=0):
'''扫描目录'''
try:
files = os.scandir(dir)
dirsize = 0
filecount = 0
for f in files:
fullname = os.path.join(dir,f.name)
if f.is_file(): # 如果是文件,则扫描文件大小
fdata = f.stat() # 获取文件信息
if fdata.st_size > file_threshold * M_SIZE: # 文件大小超过设定的阈值
finfo = [dir,f.name.replace(',','')]
finfo.append(format_time(fdata.st_ctime))
fsize = round(fdata.st_size/M_SIZE,1)
finfo.append(str(fsize))
fileinfos.append(finfo)
dirsize = fdata.st_size
filecount = 1
elif f.is_dir(): # 如果是目录,则递归扫描
cur_size,cur_count = scan_dir(fullname,level 1)
dirsize = cur_size
filecount = cur_count
if cur_size > folder_threshold * M_SIZE:
dirinfos.append([fullname.replace(',',''),str(cur_count),'%.1f'%(cur_size/M_SIZE),format_time(f.stat().st_ctime)])
if level< display_level:
print('扫描结果:{} 文件数:{:6d} 占用空间: {:6.1f} M '.format(my_rjust(50,f.name),cur_count,cur_size/M_SIZE))
return dirsize,filecount
except Exception as e:
# print(e)
# traceback.print_exception(*sys.exc_info())
return 0,0 # 出错(无权限或者文件损坏)则跳过,返回 0 值
if __name__ == '__main__':
print('开始扫描...')
dirsize,filecount = scan_dir(folder)
print('开始结束...{} 目录下共有文件{}个,所占空间 {:.2f}M'.format(folder,filecount,dirsize/M_SIZE))
with open(folder_rpt_name,'w',encoding='utf-8') as f:
for dirinfo in dirinfos:
f.write(','.join(dirinfo) '\n')
with open(file_rpt_name,'w',encoding='utf-8') as f:
for finfo in fileinfos:
f.write(','.join(finfo) '\n')
扫描结果报告(目录,文件数,占用空间(M),创建日期):
扫描的 c:/windows 目录,阈值 500 M
WinSxS 11 个 G ,为什么?
如果是全盘扫描,时间会稍长,可以先去凉快的地方待会儿。