Лучший способ конвертировать размеры файлов в Python - PullRequest
52 голосов
/ 04 марта 2011

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

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

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

Ответы [ 13 ]

0 голосов
/ 02 марта 2017

Похоже на ответ Аарона Дьюка, но более "питонно";)

import re


RE_SIZE = re.compile(r'^(\d+)([a-z])i?b?$')

def to_bytes(s):
    parts = RE_SIZE.search(s.lower().replace(',', ''))
    if not parts:
        raise ValueError("Invalid Input")
    size = parts.group(1)
    suffix = parts.group(2)
    shift = suffix.translate(str.maketrans('kmgtp', '12345')) + '0'
    return int(size) << int(shift)
0 голосов
/ 16 ноября 2016

Вот еще одна версия обратной реализации @ romeo, которая обрабатывает одну входную строку.

import re

def get_bytes(size_string):
    try:
        size_string = size_string.lower().replace(',', '')
        size = re.search('^(\d+)[a-z]i?b$', size_string).groups()[0]
        suffix = re.search('^\d+([kmgtp])i?b$', size_string).groups()[0]
    except AttributeError:
        raise ValueError("Invalid Input")
    shft = suffix.translate(str.maketrans('kmgtp', '12345')) + '0'
    return int(size) << int(shft)
0 голосов
/ 05 июля 2016

Это работает правильно для файлов всех размеров:

import math
from os.path import getsize

def convert_size(size):
   if (size == 0):
       return '0B'
   size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
   i = int(math.floor(math.log(size,1024)))
   p = math.pow(1024,i)
   s = round(size/p,2)
   return '%s %s' % (s,size_name[i])

print(convert_size(getsize('file_name.zip')))
...