Перевод размера файла в человеческий формат: байты в Кб, Мб
Быстрый ответ
Для преобразования размера файла в человекопонятный формат на 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, выводя результат с точностью до одного десятичного знака.
Погружение в детали: Байты против Десятичной системы, большие размеры файлов и отрицательные числа
Стандартная функция хорошо справляется с обычными преобразованиями. Однако следует также учесть такие аспекты как отрицательные числа, которые могут указывать на ошибку, экстремально большие размеры файлов и разницу между байтовыми и десятичными единицами измерения.
Давайте улучшим нашу функцию:
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 ЙиБ"
Теперь функция может обрабатывать числа в диапазоне от единственного байта до йоттабайт, что соответствует огромному количеству видео с кошками.
Обработка исключений: Ноль и отдельные байты
Размеры, меньшие одного байта или равные нулю, требуют особого внимания:
def human_size(size, decimal_places=1):
# ... [пропущено для краткости]
if size == 0:
return "0 Б"
elif size == 1:
return "1 Байт" # Потому что грамотность – это важно.
# ... [остаток функции]
Оптимальное решение: Использование библиотек
Иногда намного проще прибегнуть к готовой библиотеке, такой как humanize:
from humanize import naturalsize
print(naturalsize(1536)) # "1.5 КБ"
print(naturalsize(1048576, binary=True)) # "1.0 МиБ"
Библиотека поддерживает байтовые и десятичные единицы измерения, что избавляет вас от написания лишнего кода.
Визуализация
1 Байт = 🌱
1 Килобайт = 🌿
1 Мегабайт = 🌳
1 Гигабайт = 🌲🌲🌲
1 Терабайт = 🌳🌲🌴🎄🧱
Переход к новой единице измерения не просто увеличивает количество, но и укрупняет визуальное представление данных!
Хитрости и уловки: Битовые операции и рекурсия
Сверхэффективные битовые операции
Можно улучшить производительность обработки значений, используя битовые операции:
def human_size(size, decimal_places=1):
# ... [пропущено для краткости]
i = (size.bit_length() – 1) // 10
p = 1 << (i * 10)
# ... [остаток функции]
Здесь используется метод bit_length()
и битовый сдвиг для работы с бинарными размерами файлов.
Изящество рекурсии
Рекурсия помогает упростить обработку больших чисел:
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)
Рекурсия делает код более понятным и его легче читать.
Практическое применение
Интерфейс пользователя: Метки размера файла
Можно использовать функцию для отображения размера файла пользователю:
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 МБ"
Индивидуальное форматирование
Если нужно настроить вывод данных, можно дать пользователям эту возможность:
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 М"
Полезные материалы
- os.path — работа с путями файловой системы (документация Python 3.12.1) — о модуле os Python, используемом для расчета размера файла.
- hurry.filesize · PyPI — библиотека Python для преобразования размеров файлов.
- 7. Ввод и вывод – документация Python 3.12.1 — официальное руководство по форматированному выводу.
- PyFormat: Использование % и .format() для большого блага! — методы форматирования чисел.
- Новые f-строки в Python 3.6 | Специалист с опытом — обзор нового способа форматирования строк в Python, f-строк.
- Medium — хотя здесь говорится о времени, владение встроенными модулями критически важно для задач типа форматирования размеров файлов.