我发现hurry.filesize
非常有用,但它没有给出小数输出?
例如:
print size(4026, system=alternative) gives 3 KB.
但后来当我添加所有值时,我没有得到确切的总和。例如,如果hurry.filesize
的输出是4变量,每个值是3.如果我将它们全部添加,我输出为15。
我正在寻找hurry.filesize的替代方案来获得小数输出。
答案 0 :(得分:40)
这并不是很难自己实现:
suffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']
def humansize(nbytes):
i = 0
while nbytes >= 1024 and i < len(suffixes)-1:
nbytes /= 1024.
i += 1
f = ('%.2f' % nbytes).rstrip('0').rstrip('.')
return '%s %s' % (f, suffixes[i])
示例:
>>> humansize(131)
'131 B'
>>> humansize(1049)
'1.02 KB'
>>> humansize(58812)
'57.43 KB'
>>> humansize(68819826)
'65.63 MB'
>>> humansize(39756861649)
'37.03 GB'
>>> humansize(18754875155724)
'17.06 TB'
答案 1 :(得分:6)
免责声明:我写了我要描述的包
模块bitmath支持您所描述的功能。它还解决了@filmore发表的评论,在语义上我们应该使用NIST单元前缀(不是SI),也就是说,MiB而不是MB。现在也支持舍入。
您最初询问的是:
print size(4026, system=alternative)
bitmath 中的默认前缀单元系统是NIST(基于1024),因此,假设您指的是4026 bytes , bitmath中的等效解决方案看起来像以下任何一种:
In [1]: import bitmath
In [2]: print bitmath.Byte(bytes=4026).best_prefix()
3.931640625KiB
In [3]: human_prefix = bitmath.Byte(bytes=4026).best_prefix()
In [4]: print human_prefix.format("{value:.2f} {unit}")
3.93 KiB
我目前有open task允许用户在使用best_prefix
方法时选择首选前缀单位系统。
更新时间:2014-07-16 最新的 程序包已上传至PyPi,其中包含多项新功能(完整功能列表位于{ {3}})
答案 2 :(得分:5)
这比@nneonneo解决方案没有必要更快,只是有点凉爽,如果我可以这样说:)
import math
suffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']
def human_size(nbytes):
human = nbytes
rank = 0
if nbytes != 0:
rank = int((math.log10(nbytes)) / 3)
rank = min(rank, len(suffixes) - 1)
human = nbytes / (1024.0 ** rank)
f = ('%.2f' % human).rstrip('0').rstrip('.')
return '%s %s' % (f, suffixes[rank])
这是基于以下事实:任何数字的基数为10的对数的整数部分比实际的数字位数小1。剩下的就是直截了当。
答案 3 :(得分:0)
我以前每次写一些小脚本或ipynb或其他内容时都会重新发明轮子。它变得陈旧,所以我写了datasize python模块。我将其发布在这里是因为我刚刚对其进行了更新,并且哇,Python版本已经升级了!
这是一个DataSize类,它继承了int的子类,因此算术可以正常工作,但是它从算术中返回int,因为我将它与Pandas和一些numpy一起使用,并且我不想在有python时放慢速度。 ->矩阵数学库的C ++翻译。
如果需要为使用嵌入式数据的嵌入式技术处理数据,则可以使用带SI或NIST后缀(以位或字节为单位,甚至字长也可以是字长)的字符串来构造DataSize对象。 DataSize对象具有直观的format()代码语法,用于人类可读的表示形式。在内部,该值只是8位字节的整数。
例如
>>> from datasize import DataSize
>>> 'My new {:GB} SSD really only stores {:.2GiB} of data.'.format(DataSize('750GB'),DataSize(DataSize('750GB') * 0.8))
'My new 750GB SSD really only stores 558.79GiB of data.'