В Интернете существуют различные фрагменты, которые могут дать вам функцию, которая возвращает читаемый размер человека из размера в байтах:
>>> human_readable(2048)
'2 kilobytes'
>>>
Но есть ли библиотека Python, которая обеспечивает это?
python
code-snippets
filesize
Шридхар Ратнакумар
источник
источник
Ответы:
Решение указанной выше проблемы «слишком маленькая задача, чтобы требовать библиотеки» с помощью простой реализации:
Поддержка:
Пример:
по Фред Cirera
источник
B
(т.е. для блоков, отличных от байтов), вы бы хотели, чтобы коэффициент был,1000.0
а не1024.0
нет?1
строках 4 и 6 на ту точность, которую вы хотите.Библиотека, которая обладает всеми функциями, которые, как вам кажется, вы ищете
humanize
.humanize.naturalsize()
кажется, делает все, что вы ищете.источник
humanize.naturalsize(2048) # => '2.0 kB'
,humanize.naturalsize(2048, binary=True) # => '2.0 KiB'
humanize.naturalsize(2048, gnu=True) # => '2.0K'
Вот моя версия. Он не использует цикл for. Он имеет постоянную сложность, O ( 1 ), и в теории более эффективен, чем ответы здесь, которые используют цикл for.
Чтобы было более понятно, что происходит, мы можем опустить код для форматирования строки. Вот строки, которые на самом деле делают работу:
источник
1000
будет отображаться как1,000 bytes
.unit_list = list(zip(['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'], [0, 0, 1, 2, 2, 2]))
Следующее работает в Python 3.6+, на мой взгляд, самый простой для понимания ответ здесь и позволяет вам настроить количество используемых десятичных разрядов.
источник
Хотя я знаю, что этот вопрос древний, недавно я придумал версию, которая избегает циклов, используя
log2
для определения порядка размера, который удваивается как сдвиг и индекс в списке суффиксов:Впрочем, вполне может считаться непифоническим из-за его читабельности :)
источник
size
или(1 << (order * 10)
вfloat()
в последней строке (для питона 2).import math
там.Всегда должен быть один из тех парней. Ну, сегодня это я. Вот однострочное решение - или две строки, если вы посчитаете сигнатуру функции.
источник
units=None
вместо этого)Если вы используете Django, вы также можете попробовать форматировать файлы :
источник
Одна такая библиотека - спешите .
источник
Использование степеней 1000 или кибибайтов было бы более стандартным:
PS Никогда не доверяйте библиотеке, которая печатает тысячи с суффиксом K (заглавными буквами) :)
источник
P.S. Never trust a library that prints thousands with the K (uppercase) suffix :)
Почему нет? Код мог бы быть отлично звучащим, и автор просто не рассматривал корпус за килограмм. Кажется, довольно глупо автоматически отклонять любой код, основанный на вашем правиле ...Это будет делать то, что вам нужно практически в любой ситуации, настраивается с помощью необязательных аргументов и, как вы можете видеть, в значительной степени самодокументируется:
Пример вывода:
Расширенные настройки:
Этот код совместим с Python 2 и Python 3. Соответствие PEP8 - упражнение для читателя. Помните, что это красивый вывод .
Обновить:
Если вам нужны тысячи запятых, просто примените очевидное расширение:
Например:
источник
Вы должны использовать «гуманизировать».
источник
Перейдя к фрагменту, предоставленному в качестве альтернативы hurry.filesize (), здесь приведен фрагмент, который дает числа с различной точностью в зависимости от используемого префикса. Это не так кратко, как некоторые фрагменты, но мне нравятся результаты.
источник
Проект HumanFriendly помогает в этом .
Приведенный выше код даст 1 КБ в качестве ответа.
Примеры можно найти здесь .
источник
Опираясь на все предыдущие ответы, вот мой взгляд на это. Это объект, который будет хранить размер файла в байтах как целое число. Но когда вы пытаетесь напечатать объект, вы автоматически получаете читаемую человеком версию.
источник
Мне нравится фиксированная точность десятичной версии senderle , так что это своего рода гибрид этого с ответом joctee выше (знаете ли вы, что вы можете взять журналы с нецелыми основаниями?):
источник
DiveIntoPython3 также говорит об этой функции.
источник
У современного Django есть собственный шаблон шаблона
filesizeformat
:Форматирует значение, например
human-readable
размер файла (т. Е. «13 КБ», «4,1 МБ», «102 байта» и т. Д.).Например:
Если значение равно 123456789, вывод будет 117,7 МБ.
Дополнительная информация: https://docs.djangoproject.com/en/1.10/ref/templates/builtins/#filesizeformat.
источник
Как насчет простого 2 лайнера:
Вот как это работает под капотом:
Kb
, поэтому ответ должен быть X КиБ)file_size/value_of_closest_unit
вместе с юнитом.Это, однако, не работает, если размер файла равен 0 или отрицателен (поскольку журнал не определен для 0 и -ve чисел). Вы можете добавить дополнительные проверки для них:
Примеры:
ПРИМЕЧАНИЕ. - Существует разница между килобайтами и килобайтами. KB означает 1000 байтов, тогда как KiB означает 1024 байта. KB, MB, GB - это кратные 1000, тогда как KiB, MiB, GiB и т. Д. Кратны 1024. Подробнее об этом здесь
источник
источник
То, что вы собираетесь найти ниже, ни в коем случае не является самым эффективным или самым коротким решением среди уже опубликованных. Вместо этого он фокусируется на одной конкретной проблеме, которую пропускают многие другие ответы.
А именно случай, когда вводится как
999_995
:который, будучи усеченным до ближайшего целого числа и примененным обратно ко входу, дает
Похоже, это именно то, что мы ожидали, пока нам не нужно контролировать точность вывода . И это когда вещи начинают становиться немного сложнее.
С точностью до 2 цифр получаем:
вместо
1M
.Как мы можем противостоять этому?
Конечно, мы можем проверить это явно:
Но можем ли мы сделать лучше? Можем ли мы узнать, каким образом
order
следует сократить, прежде чем мы сделаем последний шаг?Оказывается, мы можем.
Предполагая правило округления до 0.5 десятичного знака, вышеприведенное
if
условие переводится в:в результате чего
дающий
источник
см.
Sridhar Ratnakumar
ответ, обновленный до:и пример вывода:
источник
Это решение может также обратиться к вам, в зависимости от того, как работает ваш разум:
источник