基于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绘制人人网好友关系图示例
Apr 01 Python
python的变量与赋值详细分析
Nov 08 Python
python opencv 直方图反向投影的方法
Feb 24 Python
Python iter()函数用法实例分析
Mar 17 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
May 29 Python
详解多线程Django程序耗尽数据库连接的问题
Oct 08 Python
django 中QuerySet特性功能详解
Jul 25 Python
django修改models重建数据库的操作
Mar 31 Python
Python自动化之UnitTest框架实战记录
Sep 08 Python
python实现定时发送邮件到指定邮箱
Dec 23 Python
python爬虫爬取图片的简单代码
Jan 18 Python
Python爬取某平台短视频的方法
Feb 08 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和ACCESS写聊天室(四)
2006/10/09 PHP
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
2010/04/07 PHP
PHP数据类型之整数类型、浮点数的介绍
2013/04/28 PHP
php使用glob函数遍历文件和目录详解
2016/09/23 PHP
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
SlideView 图片滑动(扩展/收缩)展示效果
2010/08/01 Javascript
用nodejs访问ActiveX对象,以操作Access数据库为例。
2011/12/15 NodeJs
基于javascipt-dom编程 table对象的使用
2013/04/22 Javascript
JavaScript在IE和FF下的兼容性问题
2014/05/19 Javascript
javascript学习笔记(五)原型和原型链详解
2014/10/08 Javascript
jquery.mobile 共同布局遇到的问题小结
2015/02/10 Javascript
基于JS实现导航条flash导航条
2016/06/17 Javascript
JavaScript职责链模式概述
2016/09/17 Javascript
Bootstrap select实现下拉框多选效果
2016/12/23 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
微信小程序request出现400的问题解决办法
2017/05/23 Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
2017/08/04 jQuery
vue实现重置表单信息为空的方法
2018/09/29 Javascript
Vue.js 事件修饰符的使用教程
2018/11/01 Javascript
Vue路由模块化配置的完整步骤
2019/08/14 Javascript
js实现聊天对话框
2020/02/08 Javascript
python使用多线程不断刷新网页的方法
2015/03/31 Python
Python内置数据结构与操作符的练习题集锦
2016/07/01 Python
Anaconda多环境多版本python配置操作方法
2017/09/12 Python
Django框架模板介绍
2019/01/15 Python
分享全球十款超强HTML5开发工具
2014/05/14 HTML / CSS
Argos官网:英国家喻户晓的百货零售连锁商
2017/04/03 全球购物
卫校毕业生自我鉴定
2013/10/31 职场文书
旅游网创业计划书
2014/01/31 职场文书
创建省级文明单位实施方案
2014/02/27 职场文书
环境建设实施方案
2014/03/14 职场文书
个人安全承诺书
2014/05/22 职场文书
自愿离婚协议书范本
2014/09/13 职场文书
质检员工作总结2015
2015/04/25 职场文书
详解Python小数据池和代码块缓存机制
2021/04/07 Python
python geopandas读取、创建shapefile文件的方法
2021/06/29 Python