基于Python实现文件大小输出


Posted in Python onJanuary 11, 2016

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

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

1. 注意事项与测试代码

1.需要考虑 sizeInBytes 为 None 的场景。

2.除以 1024.0 而非 1024,避免丢失精度。

实现的函数为 getSizeInMb(sizeInBytes),通用的测试代码为

def getSizeInMb(sizeInBytes):
return 0
def test(sizeInBytes):
print '%s -> %s' % (sizeInBytes, getSizeInMb(sizeInBytes))
test(None)
test(0)
test(10240000)
test(1024*1024*10)

2. 以 MB 为单位输出 -- 返回 float

通常,电子书的大小在 1 - 50MB 之间,输出时统一转为 MB 是不错的选择。

弊端:

1.输出精度过高,比如 10240000 Bytes 计算结果为 10240000 -> 9.765625

2.文件大小有限制,小于 1 MB 或 G 级数据不适合该方式展示

优势:

1.适合于用返回值参与计算

def getSizeInMb(sizeInBytes):
return (sizeInBytes or 0) / (1024.0*1024.0)

3. 以 MB 为单位保留 1 位小数 -- 返回 str

处于精度问题考虑,可以选择保留 1 位小数。

def getSizeInMb(sizeInBytes):

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

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

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

3. 以 MB 为单位保留至多 1 位小数 -- 返回 str

大多数操作系统一般展示至多 1 位小数

def getSizeInMb(sizeInBytes):
sizeInMb = '%.1f' % ((sizeInBytes or 0) / (1024.0*1024.0), ) # use 1-dimension tuple is suggested
return sizeInMb[:-2] if sizeInMb.endswith('.0') else sizeInMb # python2.5+ required

4. 自动选择最佳单位

def getSizeInNiceString(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"),
]:
if sizeInBytes >= cutoff:
return "%.1f %s" % (sizeInBytes * 1.0 / cutoff, label)
if sizeInBytes == 1:
return "1 byte"
else:
bytes = "%.1f" % (sizeInBytes or 0,)
return (bytes[:-2] if bytes.endswith('.0') else bytes) + ' bytes'

算法说明:

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

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

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

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

测试数据与结果如下图

基于Python实现文件大小输出

以上内容给大家介绍了基于Python实现文件大小输出的相关知识,希望本文分享对大家有所帮助。

Python 相关文章推荐
python中的函数用法入门教程
Sep 02 Python
django允许外部访问的实例讲解
May 14 Python
python将list转为matrix的方法
Dec 12 Python
Python Selenium 之关闭窗口close与quit的方法
Feb 13 Python
Python实现的旋转数组功能算法示例
Feb 23 Python
Dlib+OpenCV深度学习人脸识别的方法示例
May 14 Python
python Tcp协议发送和接收信息的例子
Jul 22 Python
解决python有时候import不了当前的包问题
Aug 28 Python
Python3标准库之threading进程中管理并发操作方法
Mar 30 Python
对python中list的五种查找方法说明
Jul 13 Python
关于Python错误重试方法总结
Jan 03 Python
用PYTHON去计算88键钢琴的琴键频率和音高
Apr 10 Python
详解Python发送邮件实例
Jan 10 #Python
python轻松查到删除自己的微信好友
Jan 10 #Python
如何处理Python3.4 使用pymssql 乱码问题
Jan 08 #Python
Python argv用法详解
Jan 08 #Python
详解Python爬虫的基本写法
Jan 08 #Python
黑科技 Python脚本帮你找出微信上删除你好友的人
Jan 07 #Python
星球大战与Python之间的那些事
Jan 07 #Python
You might like
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
2013/06/25 PHP
thinkphp表单上传文件并将文件路径保存到数据库中
2016/07/28 PHP
PHP实现QQ快速登录的方法
2016/09/28 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
2020/03/16 PHP
Highcharts 非常实用的Javascript统计图demo示例
2013/07/03 Javascript
jquery实现metro效果示例代码
2013/09/06 Javascript
js点击事件链接的问题解决
2014/04/25 Javascript
jQuery及JS实现循环中暂停的方法
2015/02/02 Javascript
分析了一下JQuery中的extend方法实现原理
2015/02/27 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
JS中常用的正则表达式
2016/09/29 Javascript
vue-resource 拦截器(interceptor)的使用详解
2017/07/04 Javascript
基于JS实现仿京东搜索栏随滑动透明度渐变效果
2017/07/10 Javascript
JS实现的简单表单验证功能完整实例
2017/10/14 Javascript
JS使用setInterval实现的简单计时器功能示例
2018/04/19 Javascript
Layui实现带查询条件的分页
2019/07/27 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
2019/11/07 Javascript
vue在图片上传的时候压缩图片
2020/11/18 Vue.js
[01:01:36]Optic vs paiN 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python编程中字符串和列表的基本知识讲解
2015/10/14 Python
Python进阶篇之字典操作总结
2016/11/16 Python
python logging日志模块原理及操作解析
2019/10/12 Python
Python性能分析工具Profile使用实例
2019/11/19 Python
深入浅析Python 命令行模块 Click
2020/03/11 Python
Python实现捕获异常发生的文件和具体行数
2020/04/25 Python
python在linux环境下安装skimage的示例代码
2020/10/14 Python
请说出几个常用的异常类
2013/01/08 面试题
介绍一下SQL Server里面的索引视图
2016/07/31 面试题
.net软件工程师应聘上机试题
2015/03/10 面试题
公司租房协议书
2014/10/14 职场文书
2015年医德考评自我评价
2015/03/03 职场文书
因公司原因离职的辞职信范文
2015/05/12 职场文书
2015年小班保育员工作总结
2015/05/27 职场文书
严以律己学习心得体会
2016/01/13 职场文书
python之json文件转xml文件案例讲解
2021/08/07 Python
Python数组变形的几种实现方法
2022/05/30 Python