统计文件/文件夹大小
程序员文章站
2022-06-19 08:24:09
...
初版代码
当前层的递归一return,size被重新置0,无法保存上次的size,不能得到正确结果;无法统计单文件的大小
import os
from os import path
def diy_getsize(the_path):
if path.exists(the_path):
size = 0
filelist=os.listdir(the_path)
for i in filelist:
temp_the_path=path.join(the_path,i)
if path.isdir(temp_the_path):
diy_getsize(temp_the_path)
else:
size=size+path.getsize(temp_the_path)
return size
else:
print('路径不存在')
return
print(diy_getsize(''))
第二版
无法统计单文件的大小
import os
from os import path
size=0 # 在函数外定义全局变量可以保存上次递归的结果,如果定义在函数内,递归时会重新被置0
def diy_getsize(the_path):
if path.exists(the_path):
filelist=os.listdir(the_path)
for i in filelist:
temp_the_path=path.join(the_path,i)
if path.isdir(temp_the_path):
diy_getsize(temp_the_path)
else:
global size
size=size+path.getsize(temp_the_path) # 不能直接return size+path.getsize(temp_the_path),会提前终止循环
return size
else:
print('路径不存在')
return
print(diy_getsize(''))
第三版
无论目录内是文件还是目录,都递归调用,导致递归层数太大
import os
from os import path
c1=c2=c3=0 # 统计语句执行次数,表现执行效率
def diy_getsize(the_path):
global c1,c2,c3
if path.exists(the_path):
size=0
if path.isfile(the_path):
size=size+path.getsize(the_path)
c1=c1+1
else: # 是目录,直接遍历
filelist=os.listdir(the_path)
for i in filelist: # 上面已经判断了文件,这里不用判断目录内是文件还是目录了,直接递归调用。导致递归层数很大,因为无论目录内是文件还是目录,都递归
temp_the_path=path.join(the_path,i)
size=size+diy_getsize(temp_the_path) # 只写一句递归调用,调用时会将size重新置0
c2=c2+1
c3=c3+1
return size
else:
print('路径不存在')
return
print(diy_getsize(''))
print(c1);print(c2);print(c3)
第四版
别人的,我加了统计语句执行次数,比我的次数少
import os
c1=c2=c3=0
def size(file):
global c1,c2,c3
if not os.path.exists(file):
print('文件不存在,无法计算大小')
return None
if os.path.isfile(file): # 是普通文件
return os.path.getsize(file)
total = 0
dirs = os.listdir(file) # 是目录文件,递归遍历统计
for f in dirs:
file_name = os.path.join(file, f)
if os.path.isfile(file_name):
total += os.path.getsize(file_name)
c1=c1+1
else:
total += size(file_name)
c2=c2+1
c3=c3+1
return total
print(size(''))
print(c1);print(c2);print(c3)
上一篇: MySQL执行计划中key_len详解
下一篇: openfalcon单机部署