Как преобразовать размер файла, заданного в байтах, в человекочитаемый формат?

Размер файла — это целое число байт. Но в последнее время файлы достигают таких размеров, что учитывать размер в байтах, мягко говоря, не удобно. Поэтому, все программы и системы показывают этот размер в приведенных величнах — килобайтах, мегабайтах, гигабайтах и т.д.

Вам требуется для тренировки написать функцию human_read_format(size), которая преобразует размер файла, заданный в байтах, в ЧеловекоЧитаемый Формат (ЧЧФ).

В функцию поступает параметр size — размер файла в байтах — целое неотрицательное число.

Функция должна вернуть представление размера файла в приведенных величинах — байтах (Б), килобайтах (КБ), мегабайтах (МБ) и гигабайтах (ГБ).

Учтите, что 1КБ = 1024Б, 1МБ = 1024КБ, а 1ГБ = 1024МБ.

Размер файла указывается только в старших единицах измерения, округленных до целого функцией round, например «11МБ» вместо «11МБ 130КБ».

Переход через единицы осуществляется через 1023: например, 1023КБ — это еще килобайты, а 1024КБ — это уже 1МБ.

Вот мой код:

 def human_read_format(size):
    if size < 1024:
        return size, "Б"
    elif size >= 1024:
        return size, "КБ"
    elif size >= 1048576:
        return size, "МБ"

print(human_read_format(15000))

Не понимаю, как делать дальше и куда поставить функцию round.

Например, при вводе print(human_read_format(15000)) должно выводить 15КБ, а у меня выводит 15000 КБ.


Ответы (1 шт):

Автор решения: MaxU

Попробуйте так:

import math

def human_read_format(size):
    pwr = math.floor(math.log(size, 1024))
    suff = ["Б", "КБ", "МБ", "ГБ", "ТБ", "ПБ", "ЭБ", "ЗБ", "ЙБ"]
    if size > 1024 ** (len(suff) - 1):
        return "не знаю как назвать такое число :)"
    return f"{size / 1024 ** pwr:.0f}{suff[pwr]}"
→ Ссылка