Python库,用于从字节计算人类可读的文件大小



我发现hurry.filesize非常有用,但它不能以十进制形式输出?

例如:

print size(4026, system=alternative) gives 3 KB.

但后来当我把所有的值加起来时,我没有得到确切的和。例如,如果hurry.filesize的输出为4个变量,并且每个值为3。如果我把它们全部加起来,我得到的输出是15。

我正在寻找hurry.filesize的替代方案,以获得十进制输出。

这并不难实现:

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'

免责声明:我编写了要描述的包

模块bitmath支持您所描述的功能。它还解决了@filmore的评论,即从语义上讲,我们应该使用NIST单位前缀(而不是SI),也就是说,MiB而不是MB舍入现在也支持。

您最初询问的是:

print size(4026, system=alternative)

bitmath中,默认前缀单位系统是NIST(基于1024),因此,假设您指的是4026字节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

我目前有一个打开的任务,允许用户在使用best_prefix方法时选择首选前缀单位系统。

更新:2014-07-16最新的软件包已上传到PyPi,其中包括几个新功能(完整功能列表在GitHub页面上)

这不一定比@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为底的对数的整数部分都比实际数字少一个。剩下的都是直截了当的。

我过去每次写一个小脚本或ipynb或其他什么东西时都会重新发明轮子。它变得老套了,所以我编写了datasize python模块。我在这里发布这篇文章是因为我刚刚更新了它,哇,Python版本更新了!

它是一个DataSize类,它对int进行了子类化,所以算术只起作用,但它从算术中返回int,因为我将它与Pandas和一些numpy一起使用,并且当存在python&lt--&gt;矩阵数学库的C++翻译。

您可以使用以位或字节为单位的SI或NIST后缀的字符串来构造DataSize对象,如果您需要为使用这些后缀的嵌入式技术处理数据,甚至可以使用wierd字长。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.'