python os爬取一文件夹下所有文件,获取大小并排序

本文介绍了如何使用Python的os库遍历文件夹,获取每个文件的大小和占用空间,并进行排序。通过递归方式遍历文件,处理拒绝访问的特殊文件夹,并提供了完整的代码示例。
摘要由CSDN通过智能技术生成

目录

一、导入库

二、 获取指定文件大小和占用空间

三、递归遍历文件

四、排序 & 封装

五、完整代码


一、导入库

我们需要导入os库来进行文件处理和路径管理问题,math中的ceil函数 

from os import *
from math import *

二、 获取指定文件大小和占用空间

如何获取文件或文件夹大小呢?

我们需要os.path中的getsize语句

如:

from os import *

f = r"C:\Users\LENOVO\Desktop\os_path"
print(path.getsize(f))  # 我这台电脑的输出-> 4546 (字节bit)

那么我们怎么将字节转成我们看得懂的85B、100MB、8GB、等等呢?

我们就来写一个将字节转大小的函数吧:

from os import *
from math import *


def size(a):
    size_list = [1024 * 1024 * 1024 * 1024, 1024 * 1024 * 1024, 1024 * 1024, 1024, 0]  # 1TB,1GB,1MB,1KB,0B对应的字节
    symbol_list = ["TB", "GB", "MB", "KB", "B"]  # 文件大小单位表
    for x in range(5):  # 遍历列表
        if a >= size_list[x]:  # 如果比特值a大于等于1TB,1GB,1MB,1KB或0B也就是单位值为symbol_list[x]详见下表
            try:
                return str("%.2f" % (a / size_list[x])) + symbol_list[x]  # 放回"大小+单位"
            # 我们发现占用空间和大小都是保留两位小数的,所以需要%.2f
            except ZeroDivisionError:  # 说明大小为零
                return str(a) + "B"  # 返回0B


f = r"C:\Users\LENOVO\Desktop\os_path.py"
print(size(path.getsize(f)))  # 我这台电脑的输出-> 4.43KB

我们是怎么实现的的呢?

因为是从大到小判断是否大于1TB,1GB,1MB,1KB,于0B的。

也就是说,大于等于1TB的就用TB如100TB,不大于等于1TB但大于等于1GB的就用单位GB如10GB,不大于等于1GB但大于等于1MB的用单位MB……那为什么不大于1KB但大于等于0B是单位B呢?因为还有一个0B的大小。

那么知道了文件大小,怎么算占用空间呢?

这与是硬盘分区格式有关。
大小是文件的实际大小,而占用空间是占硬盘的实际空间,以FAT32格式为例,硬盘的基本存储单位是簇,在FAT32中一簇是4KB 。那么,也就是说即使文件只有1个字节,在硬盘上也要占到4KB的空间 如果文件是4KB零1个字节,那就要占用8KB的空间,以此类推 结论: 大小是文件的实际大小,而占用空间是占硬盘的实际空间。如图(我这里一簇是4KB,你只要创建一个文本文件看一看它属性中的占用空间就知道了)

 那么如何计算呢 ?

我们只需要给path.getsize(f)÷4096向上取整×4096就是占用空间(这里4096是1簇也就是4KB的字节数)

也就是:

from os import *
from math import *


def size(a):
    size_list = [1024 * 1024 * 1024 * 1024, 1024 * 1024 * 1024, 1024 * 1024, 1024, 0]  # 1TB,1GB,1MB,1KB,0B对应的字节
    symbol_list = ["TB", "GB", "MB", "KB", "B"]  # 文件大小单位表
    for x in range(5):  # 遍历列表
        if a >= size_list[x]:  # 如果比特值a大于等于1TB,1GB,1MB,1KB或0B也就是单位值为symbol_list[x]详见下表
            try:
                return str("%.2f" % (a / size_list[x])) + symbol_list[x]  # 放回"大小+单位"
            # 我们发现占用空间和大小都是保留两位小数的,所以需要%.2f
            except ZeroDivisionError:  # 说明大小为零
                return str(a) + "B"  # 返回0B


f = r"C:\Users\LENOVO\Desktop\os_path.py"
print(size(path.getsize(f)))  # 我这台电脑的输出-> 4.43KB
print(size(int(ceil(path.getsize(f) / 4096)) * 4096))  # 我这台电的输出-> 8.00KB

 我们再来看看:属性后面是不是有一个括号里写着字节?

我们如何添加这个呢?

做法非常简单,代码如下:

from os import *
from math import *


def size(a):
    size_list = [1024 * 1024 * 1024 * 1024, 1024 * 1024 * 1024, 1024 * 1024, 1024, 0]  # 1TB,1GB,1MB,1KB,0B对应的比特值
    symbol_list = ["TB", "GB", "MB", "KB", "B"]  # 文件大小单位表
    for x in range(5):  # 遍历列表
        if a >= size_list[x]:  # 如果比特值a大于等于1TB,1GB,1MB,1KB或0B也就是单位值为symbol_list[x]详见下表
            try:
                return str("%.2f" % (a / size_list[x])) + symbol_list[x]  # 放回"大小+单位"
            # 我们发现占用空间和大小都是保留两位小数的,所以需要%.2f
            except ZeroDivisionError:  # 说明大小为零
                return str(a) + "B"  # 返回0B


f = r"C:\Users\LENOVO\Desktop\os_path.py"
print(size(path.getsize(f))+"(" + str(path.getsize(f)) + "字节" + ")")  # 我这台电脑的输出-> 4.87KB(5037字节)
print(size(int(ceil(path.getsize(f) / 4096)) * 4096)+"(" + str(int(ceil(path.getsize(f) / 4096)) * 4096) + "字节" + ")")  # 我这台电的输出-> 8.00KB(8192字节)

三、递归遍历文件

学会获取指定文件大小和占用空间了,现在就该到遍历文件的部分,我们这次用递归的方式遍历文件,思路很简单:写一个函数scaner_file,利用递归解决问题,遍历路径下的每一个项目,如果是文件,在listdir1列表里加入这个文件的信息,如果是一个文件夹,则递归调用自己这个函数遍历下一层。

from os import *
from math import *


def size(a):
    size_list = [1024 * 1024 * 1024 * 1024, 1024 * 1024 * 1024, 1024 * 1024, 1024, 0]  # 1TB,1GB,1MB,
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值