目录
一、导入库
我们需要导入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,