基于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中使用cookielib和urllib2配合PyQuery抓取网页信息
Apr 25 Python
详解Python的Django框架中的中间件
Jul 24 Python
Python实现动态加载模块、类、函数的方法分析
Jul 18 Python
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
Aug 18 Python
详解python中的Turtle函数库
Nov 19 Python
在python带权重的列表中随机取值的方法
Jan 23 Python
对python中的float除法和整除法的实例详解
Jul 20 Python
python提取照片坐标信息的实例代码
Aug 14 Python
Numpy ndarray 多维数组对象的使用
Feb 10 Python
python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)
Feb 19 Python
python爬虫scrapy基本使用超详细教程
Feb 20 Python
Python一些基本的图像操作和处理总结
Jun 23 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
PHP+Mysql+jQuery实现动态展示信息
2011/10/08 PHP
php导出中文内容excel文件类实例
2015/07/06 PHP
PHP加密解密函数详解
2015/10/28 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
php使用pecl方式安装扩展操作示例
2019/08/12 PHP
PHP数组与字符串互相转换实例
2020/05/05 PHP
Javascript 模式实例 观察者模式
2009/10/24 Javascript
js+css在交互上的应用
2010/07/18 Javascript
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
js从10种颜色中随机取色实现每次取出不同的颜色
2013/10/23 Javascript
批量修改标签css样式以input标签为例
2014/07/31 Javascript
基于javascript实现动态时钟效果
2020/08/18 Javascript
浅析jQuery事件之on()方法绑定多个选择器,多个事件
2016/04/27 Javascript
javascript编程实现栈的方法详解【经典数据结构】
2017/04/11 Javascript
深入理解AngularJs-scope的脏检查(一)
2017/06/19 Javascript
JS点击图片弹出文件选择框并覆盖原图功能的实现代码
2017/08/25 Javascript
详谈js中标准for循环与foreach(for in)的区别
2017/11/02 Javascript
Vue.js 踩坑记之双向绑定
2018/05/03 Javascript
RxJS的入门指引和初步应用
2019/06/15 Javascript
vue 实现tab切换保持数据状态
2020/07/21 Javascript
vue移动端弹起蒙层滑动禁止底部滑动操作
2020/07/22 Javascript
python封装对象实现时间效果
2020/04/23 Python
Python使用分布式锁的代码演示示例
2018/07/30 Python
Python选择网卡发包及接收数据包
2019/04/04 Python
Python 循环终止语句的三种方法小结
2019/06/24 Python
python创建学生管理系统
2019/11/22 Python
python重要函数eval多种用法解析
2020/01/14 Python
解决json中ensure_ascii=False的问题
2020/04/03 Python
CSS3 简写animation
2012/05/10 HTML / CSS
html5中去掉input type date默认样式的方法
2018/09/06 HTML / CSS
汽车技术服务与营销专业推荐信
2013/11/29 职场文书
大四自我鉴定
2014/02/08 职场文书
团购业务员岗位职责
2014/03/15 职场文书
网上祭英烈活动总结
2015/02/04 职场文书
阿甘正传观后感
2015/06/01 职场文书
Redis过期数据是否会被立马删除
2022/07/23 Redis