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

20 投票
4 回答
22201 浏览
提问于 2025-04-17 16:36

我觉得 hurry.filesize 非常好用,但它的输出不是十进制的。

举个例子:

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

但是后来当我把所有的值加起来时,结果并不准确。比如说,如果 hurry.filesize 的输出有4个变量,每个值都是3,那我加起来的结果就是15。

我在寻找一个可以输出十进制的 hurry.filesize 的替代品。

4 个回答

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。剩下的部分其实很简单。

9

免责声明:我写了下面要介绍的这个软件包

这个模块 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 页面 上)

63

这其实并不难,你完全可以自己实现:

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'

撰写回答