Размер читаемого человеком байта в питоне - PullRequest
0 голосов
/ 19 октября 2019

Как мы можем отобразить читаемый человеком размер байта в python?

Нам нужно преобразовать большие нечитаемые int результаты, например, из os.stat(r'C:\1.pdf').st_size

(отвечая на мой собственный вопросниже с f-строками для версий Python выше 3.6, пожалуйста, добавьте свои собственные ответы, если они применимы к другим версиям Python или другим способам форматирования)

1 Ответ

3 голосов
/ 19 октября 2019

Просто хотел поделиться этим небольшим фрагментом на тот случай, если кто-нибудь найдет его полезным, эта функция преобразует размеры в байтах (например, те, которые вы получите от 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]

Если вы этого не сделаетечтобы сделать from typing import Union, просто удалите эту подсказку типа из функции, это просто для того, чтобы показать, что эта функция может принимать аргументы int, float и str. Урезанная версия будет выглядеть следующим образом:

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]

Примеры:

>>> 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

Ограничения: эта функция перечисляет только единицы измерения до терабайт (ТБ), ноэто можно легко изменить, расширив кортеж units. Очевидно, что здесь используются f-строки, поэтому применяется только для версий Python выше 3.6

...