基于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读写ini文件示例(python读写文件)
Mar 25 Python
python字符串编码识别模块chardet简单应用
Jun 15 Python
python批量提取word内信息
Aug 09 Python
git使用.gitignore设置不生效或不起作用问题的解决方法
Jun 01 Python
Python编程求解二叉树中和为某一值的路径代码示例
Jan 04 Python
transform python环境快速配置方法
Sep 27 Python
解决Python下json.loads()中文字符出错的问题
Dec 19 Python
Python爬虫抓取技术的一些经验
Jul 12 Python
python实现BP神经网络回归预测模型
Aug 09 Python
Python 生成一个从0到n个数字的列表4种方法小结
Nov 28 Python
python GUI库图形界面开发之PyQt5布局控件QGridLayout详细使用方法与实例
Mar 06 Python
Python加载数据的5种不同方式(收藏)
Nov 13 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
基于Zend的Captcha机制的应用
2013/05/02 PHP
基于php设计模式中工厂模式详细介绍
2013/05/15 PHP
PHP邮箱验证示例教程
2016/06/01 PHP
PHP 枚举类型的管理与设计知识点总结
2020/02/13 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
修复ie8&chrome下window的resize事件多次执行
2011/10/20 Javascript
jQuery+AJAX实现网页无刷新上传
2015/02/22 Javascript
javascript之Boolean类型对象
2016/06/07 Javascript
vue.js利用Object.defineProperty实现双向绑定
2017/03/09 Javascript
深入理解vuex2.0 之 modules
2017/11/20 Javascript
利用Javascript获取选择文本所在的句子详解
2017/12/03 Javascript
p5.js临摹动态图形的方法
2019/10/23 Javascript
小程序外卖订单界面的示例代码
2019/12/30 Javascript
Python中__init__和__new__的区别详解
2014/07/09 Python
Python3中的列表,元组,字典,字符串相关知识小结
2017/11/10 Python
Python生成器定义与简单用法实例分析
2018/04/30 Python
pyqt5 实现工具栏文字图片同时显示
2019/06/13 Python
用Cython加速Python到“起飞”(推荐)
2019/08/01 Python
django自带serializers序列化返回指定字段的方法
2019/08/21 Python
python3文件复制、延迟文件复制任务的实现方法
2019/09/02 Python
原来我一直安装 Python 库的姿势都不对呀
2019/11/11 Python
Django使用Profile扩展User模块方式
2020/05/14 Python
keras的load_model实现加载含有参数的自定义模型
2020/06/22 Python
Python使用windows设置定时执行脚本
2020/11/12 Python
HTML5 Canvas的性能提高技巧经验分享
2013/07/02 HTML / CSS
C#怎么让一个窗口居中显示?
2015/10/20 面试题
园林设计师自荐信
2013/11/18 职场文书
生日宴会答谢词
2014/01/09 职场文书
高二地理教学反思
2014/01/24 职场文书
给老师的检讨书
2014/02/11 职场文书
读群众路线心得体会
2014/03/07 职场文书
股权收购意向书
2014/04/01 职场文书
2014党的群众路线教育实践活动总结报告
2014/10/31 职场文书
2016新年慰问信范文
2015/03/25 职场文书
行政介绍信范文
2015/05/04 职场文书
新员工辞职信范文
2015/05/12 职场文书