文件大小的友好输出及其Python实现

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

在数据库中存储时,使用 Bytes 更精确,可扩展性和灵活性都很高。

输出时,需要做一些适配。

1. 注意事项与测试代码需要考虑 sizeInBytes 为 None 的场景。除以 1024.0 而非 1024,避免丢失精度。实现的函数为 getSizeInMb(sizeInBytes),通用的测试代码为

defgetSizeInMb(sizeInBytes):return0deftest(sizeInBytes):PRint'%s -> %s'%(sizeInBytes, getSizeInMb(sizeInBytes))

test(None)

test(0)

test(10240000)

test(1024*1024*10)

2. 以 MB 为单位输出 -- 返回 float 通常,电子书的大小在 1 - 50MB 之间,输出时统一转为 MB 是不错的选择。

弊端:输出精度过高,比如 10240000 Bytes 计算结果为 10240000 -> 9.765625文件大小有限制,小于 1 MB 或 G 级数据不适合该方式展示优势:适合于用返回值参与计算defgetSizeInMb(sizeInBytes):return(sizeInBytesor0) / (1024.0*1024.0)

3. 以 MB 为单位保留 1 位小数 -- 返回 str处于精度问题考虑,可以选择保留 1 位小数。

defgetSizeInMb(sizeInBytes):return'%.1f'% ((sizeInBytesor0) / (1024.0*1024.0), )#use 1-dimension tuple is suggested

返回值建议写成 '%.1f' % (number,) 而非 '%.1f' % (number)

二者均能正确执行,但后者容易被误判为执行只有一个参数 number 的函数,导致难以判断的错误。

3. 以 MB 为单位保留至多 1 位小数 -- 返回 str大多数操作系统一般展示至多1 位小数

defgetSizeInMb(sizeInBytes):

sizeInMb='%.1f'% ((sizeInBytesor0) / (1024.0*1024.0), )#use 1-dimension tuple is suggestedreturnsizeInMb[:-2]ifsizeInMb.endswith('.0')elsesizeInMb#python2.5+ required

4. 自动选择最佳单位defgetSizeInNiceString(sizeInBytes):"""Convert the given byteCount into a string like: 9.9bytes/KB/MB/GB"""for(cutoff, label)in[(1024*1024*1024,"GB"),

(1024*1024,"MB"),

(1024,"KB"),

]:ifsizeInBytes >=cutoff:return"%.1f %s"% (sizeInBytes * 1.0 /cutoff, label)ifsizeInBytes == 1:return"1 byte"else:

bytes="%.1f"% (sizeInBytesor0,)return(bytes[:-2]ifbytes.endswith('.0')elsebytes) +'bytes'

算法说明:

1. 从英语语法角度,只有 1 使用单数形式。其他 0/小数 均使用复数形式。涉及 bytes 级别

2. 精度方面,KB 及以上级别,保留 1 位小数。bytes 保留至多1 位小数。

这种处理规则,不适合于小数十分位为 0 的情况,比如 10.0 bytes,10.01 bytes。输入结果均为 10 bytes。

其他情况下,精度均不存在问题。

测试数据与结果如下图

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航