18

我觉得hurry.filesize非常有用,但它没有以十进制输出?

例如:

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

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

我也在寻找 hurry.filesize 的替代方法来获得小数输出。

4

4 回答 4

55

这并不难实现自己:

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'
于 2013-02-21T07:31:45.660 回答
9

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

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

您最初询问的是:

print size(4026, system=alternative)

bitmath中,默认前缀单位系统是 NIST(基于 1024),因此,假设您指的是 4026 bytesbitmath中的等效解决方案将如下所示:

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 页面上

于 2014-07-14T01:42:12.990 回答
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 为底的对数的整数部分比实际位数少一。其余的几乎都是直截了当的。

于 2013-02-21T09:39:59.347 回答
1

每次我写一个小脚本或 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.'
于 2020-11-30T02:05:24.840 回答