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

时间:2013-02-21 07:08:06

标签: python python-module

我发现hurry.filesize非常有用,但它没有给出小数输出?

例如:

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

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

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

4 个答案:

答案 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.'