python 中人类可读的字节大小

Ofe*_*dan 1 python human-readable python-3.x python-3.6 f-string

我们如何在 python 中显示人类可读的字节大小?

我们需要转换大量不可读的int结果,例如os.stat(r'C:\1.pdf').st_size

(下面用 3.6 以上的 python 版本的 f-strings 回答我自己的问题,如果它们适用于其他 python 版本或其他格式化方式,请添加您自己的答案)

Ofe*_*dan 5

只是想分享这个小片段,以防有人发现它有用,这个函数转换字节大小(就像你从 获得的那样os.stat(r'C:\1.pdf').st_size

from typing import Union
def readable_size(size: Union[int, float, str]) -> str:
    units = ('KB', 'MB', 'GB', 'TB')
    size_list = [f'{int(size):,} B'] + [f'{int(size) / 1024 ** (i + 1):,.1f*} {u}' for i, u in enumerate(units)]
    return [size for size in size_list if not size.startswith('0.')][-1]
Run Code Online (Sandbox Code Playgroud)

如果您不想from typing import Union从函数中删除该类型提示,那么这里只是为了表明该函数可以接受intfloatstr参数。精简版本如下所示:

def readable_size(size):
    units = ('KB', 'MB', 'GB', 'TB')
    size_list = [f'{int(size):,} B'] + [f'{int(size) / 1024 ** (i + 1):,.1f*} {u}' for i, u in enumerate(units)]
    return [size for size in size_list if not size.startswith('0.')][-1]
Run Code Online (Sandbox Code Playgroud)

例子:

>>> import random
>>> for i in range(15):
...     size = random.randint(1 ** i, 9 ** i)
...     print(f'{size} = {readable_size(size)}')
...
1 = 1 B
3 = 3 B
61 = 61 B
267 = 267 B
5127 = 5.0 KB
37700 = 36.8 KB
68512 = 66.9 KB
342383 = 334.4 KB
42580724 = 40.6 MB
40250452 = 38.4 MB
1789601996 = 1.7 GB
16242182039 = 15.1 GB
131167506597 = 122.2 GB
1827741623713 = 1.7 TB
5613973017836 = 5.1 TB
Run Code Online (Sandbox Code Playgroud)

限制:此函数仅列出高达太字节 (TB) 的单位,但可以通过扩展元组轻松修改units。显然这使用了 f 字符串,因此仅适用于 3.6 以上的 python 版本