欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

统计文件/文件夹大小

程序员文章站 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)