Лучший способ преобразовать размеры файла в Python

Я пользуюсь библиотекой, которая читает файл и возвращает его размер в байтах.

Этот размер файла затем отображен конечному пользователю; чтобы помочь им понять это, я явно преобразовываю размер файла в MB путем деления его на 1024.0 * 1024.0. Конечно, это работает, но я задаюсь вопросом, там лучший способ сделать это в Python?

Лучше, я имею в виду, возможно, функцию stdlib, которая может управлять размерами согласно типу, который я хочу. Как то, если я указываю MB, это автоматически делит его на 1024.0 * 1024.0. Somethign на этих строках.

60
задан 4 March 2011 в 16:04

1 ответ

Вот моя реализация:

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)
0
ответ дан 31 October 2019 в 16:39

Другие вопросы по тегам:

Похожие вопросы: