Я пользуюсь библиотекой, которая читает файл и возвращает его размер в байтах.
Этот размер файла затем отображен конечному пользователю; чтобы помочь им понять это, я явно преобразовываю размер файла в MB
путем деления его на 1024.0 * 1024.0
. Конечно, это работает, но я задаюсь вопросом, там лучший способ сделать это в Python?
Лучше, я имею в виду, возможно, функцию stdlib, которая может управлять размерами согласно типу, который я хочу. Как то, если я указываю MB
, это автоматически делит его на 1024.0 * 1024.0
. Somethign на этих строках.
Вот моя реализация:
from bisect import bisect
def to_filesize(bytes_num, si=True):
decade = 1000 if si else 1024
partitions = tuple(decade ** n for n in range(1, 6))
suffixes = tuple('BKMGTP')
i = bisect(partitions, bytes_num)
s = suffixes[i]
for n in range(i):
bytes_num /= decade
f = '{:.3f}'.format(bytes_num)
return '{}{}'.format(f.rstrip('0').rstrip('.'), s)
Это распечатает до трех десятичных чисел, и это разделяет конечные нули и периоды. Булев параметр si
переключит использование на основе 10 по сравнению с величиной размера на основе 2.
Это - его дубликат. Это позволяет писать чистые конфигурационные файлы как {'maximum_filesize': from_filesize('10M')
. Это возвращает целое число, которое приближает намеченный размер файла. Я не использую смещение бита, потому что исходное значение является числом с плавающей точкой (оно примет from_filesize('2.15M')
очень хорошо). Преобразование его к целому числу/десятичному числу работало бы, но делает код более сложным, и это уже работает как есть
def from_filesize(spec, si=True):
decade = 1000 if si else 1024
suffixes = tuple('BKMGTP')
num = float(spec[:-1])
s = spec[-1]
i = suffixes.index(s)
for n in range(i):
num *= decade
return int(num)