Перевод размера файла в человеческий формат: байты в Кб, Мб

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для преобразования размера файла в человекопонятный формат на Python, вы можете использовать следующую функцию:

Python
Скопировать код
def human_size(size):
    units = ['Б', 'КБ', 'МБ', 'ГБ', 'ТБ', 'ПБ']
    for unit in units:
        if size < 1024:
            return f"{size:.1f} {unit}"
        size /= 1024
        
print(human_size(1536))  # "1.5 КБ"

Этот метод последовательно уменьшает размер файла до тех пор, пока он не станет меньше 1024, выводя результат с точностью до одного десятичного знака.

Кинга Идем в IT: пошаговый план для смены профессии

Погружение в детали: Байты против Десятичной системы, большие размеры файлов и отрицательные числа

Стандартная функция хорошо справляется с обычными преобразованиями. Однако следует также учесть такие аспекты как отрицательные числа, которые могут указывать на ошибку, экстремально большие размеры файлов и разницу между байтовыми и десятичными единицами измерения.

Давайте улучшим нашу функцию:

Python
Скопировать код
import math

def human_size(size, decimal_places=1):
    units = ['Б', 'КиБ', 'МиБ', 'ГиБ', 'ТиБ', 'ПиБ', 'ЭиБ', 'ЗиБ', 'ЙиБ']
    if size < 0:
        sign = "-"
        size = -size
    else:
        sign = ""
    
    if size < 1:
        return f"{sign}0 Б"
    
    i = int(math.log(size, 1024))
    p = math.pow(1024, i)
    s = round(size / p, decimal_places)
    return f"{sign}{s} {units[i]}"

print(human_size(1536))                   # "1.5 КиБ"
print(human_size(5294967296))             # "4.9 ГиБ"
print(human_size(-1024))                  # "-1.0 КиБ"
print(human_size(1234567890000000000000)) # "1.1 ЙиБ"

Теперь функция может обрабатывать числа в диапазоне от единственного байта до йоттабайт, что соответствует огромному количеству видео с кошками.

Обработка исключений: Ноль и отдельные байты

Размеры, меньшие одного байта или равные нулю, требуют особого внимания:

Python
Скопировать код
def human_size(size, decimal_places=1):
    # ... [пропущено для краткости]
    
    if size == 0:
        return "0 Б"
    elif size == 1:
        return "1 Байт"  # Потому что грамотность – это важно.
    
    # ... [остаток функции]

Оптимальное решение: Использование библиотек

Иногда намного проще прибегнуть к готовой библиотеке, такой как humanize:

Python
Скопировать код
from humanize import naturalsize

print(naturalsize(1536))  # "1.5 КБ"
print(naturalsize(1048576, binary=True))  # "1.0 МиБ"

Библиотека поддерживает байтовые и десятичные единицы измерения, что избавляет вас от написания лишнего кода.

Визуализация

Markdown
Скопировать код
1 Байт      = 🌱 
1 Килобайт  = 🌿  
1 Мегабайт  = 🌳  
1 Гигабайт  = 🌲🌲🌲 
1 Терабайт  = 🌳🌲🌴🎄🧱

Переход к новой единице измерения не просто увеличивает количество, но и укрупняет визуальное представление данных!

Хитрости и уловки: Битовые операции и рекурсия

Сверхэффективные битовые операции

Можно улучшить производительность обработки значений, используя битовые операции:

Python
Скопировать код
def human_size(size, decimal_places=1):
    # ... [пропущено для краткости]
    
    i = (size.bit_length() – 1) // 10
    p = 1 << (i * 10)
    
    # ... [остаток функции]

Здесь используется метод bit_length() и битовый сдвиг для работы с бинарными размерами файлов.

Изящество рекурсии

Рекурсия помогает упростить обработку больших чисел:

Python
Скопировать код
def human_size_recursive(size, units=None, step=0):
    if units is None:
        units = ['Б', 'КиБ', 'МиБ', 'ГиБ', 'ТиБ', 'ПиБ']
    if size < 1024 or step == len(units) – 1:
        return f"{size:.{decimal_places}f} {units[step]}"
    return human_size_recursive(size / 1024, units, step + 1)

Рекурсия делает код более понятным и его легче читать.

Практическое применение

Интерфейс пользователя: Метки размера файла

Можно использовать функцию для отображения размера файла пользователю:

Python
Скопировать код
def file_size_label(file_path):
    size = os.path.getsize(file_path)
    return f"Размер файла: {human_size(size)}"

print(file_size_label("/path/to/your/file.txt"))  # "Размер файла: 5.2 МБ"

Индивидуальное форматирование

Если нужно настроить вывод данных, можно дать пользователям эту возможность:

Python
Скопировать код
def human_size(size, decimal_places=1, abbreviate=True):
    # ... [пропущено для краткости]
    
    unit = units[i]
    if abbreviate:
        unit = unit[0] if unit != "Б" else unit
    return f"{sign}{s} {unit}"

print(human_size(1048576, decimal_places=2, abbreviate=False))  # "1.00 МиБ"
print(human_size(1048576, abbreviate=True))                     # "1.0 М"

Полезные материалы

  1. os.path — работа с путями файловой системы (документация Python 3.12.1) — о модуле os Python, используемом для расчета размера файла.
  2. hurry.filesize · PyPI — библиотека Python для преобразования размеров файлов.
  3. 7. Ввод и вывод – документация Python 3.12.1 — официальное руководство по форматированному выводу.
  4. PyFormat: Использование % и .format() для большого блага! — методы форматирования чисел.
  5. Новые f-строки в Python 3.6 | Специалист с опытом — обзор нового способа форматирования строк в Python, f-строк.
  6. Medium — хотя здесь говорится о времени, владение встроенными модулями критически важно для задач типа форматирования размеров файлов.