可重用的库以获取文件大小的可读版本?

2024-04-29 08:32:07 发布

您现在位置:Python中文网/ 问答频道 /正文

web上有各种代码片段,它们将提供一个函数,用于从字节大小返回人类可读的大小:

>>> human_readable(2048)
'2 kilobytes'
>>>

但是是否有一个Python库提供了这个功能?


Tags: 函数代码功能web字节人类readablehuman
3条回答

通过简单的实现解决上述“任务太小,不需要库”问题:

def sizeof_fmt(num, suffix='B'):
    for unit in ['','Ki','Mi','Gi','Ti','Pi','Ei','Zi']:
        if abs(num) < 1024.0:
            return "%3.1f%s%s" % (num, unit, suffix)
        num /= 1024.0
    return "%.1f%s%s" % (num, 'Yi', suffix)

支持:

  • 所有当前已知的binary prefixes
  • 负数和正数
  • 大于1000字节的数字
  • 任意单位(也许你喜欢用吉布斯数!)

示例:

>>> sizeof_fmt(168963795964)
'157.4GiB'

通过Fred Cirera

一个拥有所有功能的库是^{}humanize.naturalsize()似乎做了你想要的一切。

这是我的版本。它不使用for循环。它具有恒定的复杂性O(1),理论上比这里使用for循环的答案更有效。

from math import log
unit_list = zip(['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'], [0, 0, 1, 2, 2, 2])
def sizeof_fmt(num):
    """Human friendly file size"""
    if num > 1:
        exponent = min(int(log(num, 1024)), len(unit_list) - 1)
        quotient = float(num) / 1024**exponent
        unit, num_decimals = unit_list[exponent]
        format_string = '{:.%sf} {}' % (num_decimals)
        return format_string.format(quotient, unit)
    if num == 0:
        return '0 bytes'
    if num == 1:
        return '1 byte'

为了更清楚地说明发生了什么,我们可以省略字符串格式的代码。以下是实际完成工作的几行:

exponent = int(log(num, 1024))
quotient = num / 1024**exponent
unit_list[exponent]

相关问题 更多 >