Библиотеки Python для вычисления удобочитаемых файлов размером в байтах?

Я нахожу hurry.filesize очень полезным, но он не дает результат в десятичной hurry.filesize ?

Например:

 print size(4026, system=alternative) gives 3 KB. 

Но позже, когда я добавляю все значения, я не получаю точную сумму. Например, если выход hurry.filesize находится в 4 переменных, а каждое значение равно 3. Если я их добавлю, я получаю вывод как 15.

Я ищу альтернативу hurry.filesize, чтобы получить выходные данные в десятичных знаках.

Это не очень сложно реализовать самостоятельно:

 suffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'] def humansize(nbytes): i = 0 while nbytes >= 1024 and i < len(suffixes)-1: nbytes /= 1024. i += 1 f = ('%.2f' % nbytes).rstrip('0').rstrip('.') return '%s %s' % (f, suffixes[i]) 

Примеры:

 >>> humansize(131) '131 B' >>> humansize(1049) '1.02 KB' >>> humansize(58812) '57.43 KB' >>> humansize(68819826) '65.63 MB' >>> humansize(39756861649) '37.03 GB' >>> humansize(18754875155724) '17.06 TB' 

Отказ от ответственности: я написал пакет, который я собираюсь описать

Модуль битмат поддерживает описанную вами функциональность. Он также рассматривает комментарий, сделанный @filmore, что семантически мы должны использовать префиксы NIST (не SI), то есть MiB вместо MB. округление теперь поддерживается.

Сначала вы спросили:

 print size(4026, system=alternative) 

в битмате система префикса по умолчанию – это NIST (на основе 1024), поэтому, предполагая, что вы ссылаетесь на 4026 байт , эквивалентное решение в битмате будет выглядеть как любое из следующего:

 In [1]: import bitmath In [2]: print bitmath.Byte(bytes=4026).best_prefix() 3.931640625KiB In [3]: human_prefix = bitmath.Byte(bytes=4026).best_prefix() In [4]: print human_prefix.format("{value:.2f} {unit}") 3.93 KiB 

В настоящее время у меня есть открытая задача, позволяющая пользователю выбирать предпочтительную систему префикс-единиц при использовании метода best_prefix .

Обновление: 2014-07-16 Последний пакет был загружен в PyPi и включает в себя несколько новых функций (полный список функций находится на странице GitHub )

Это не нужно быстрее, чем решение @nneonneo , это немного более прохладно , если можно так сказать 🙂

 import math suffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'] def human_size(nbytes): human = nbytes rank = 0 if nbytes != 0: rank = int((math.log10(nbytes)) / 3) rank = min(rank, len(suffixes) - 1) human = nbytes / (1024.0 ** rank) f = ('%.2f' % human).rstrip('0').rstrip('.') return '%s %s' % (f, suffixes[rank]) 

Это работает на основании того, что целочисленная часть логарифма с базой 10 любого числа на единицу меньше фактического числа цифр. Остальное довольно прямолинейно.