Better way to convert file sizes in Python [closed] Better way to convert file sizes in Python [closed] python python

Better way to convert file sizes in Python [closed]


Here is what I use:

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

NB : size should be sent in Bytes.


There is hurry.filesize that will take the size in bytes and make a nice string out if it.

>>> from hurry.filesize import size>>> size(11000)'10K'>>> size(198283722)'189M'

Or if you want 1K == 1000 (which is what most users assume):

>>> from hurry.filesize import size, si>>> size(11000, system=si)'11K'>>> size(198283722, system=si)'198M'

It has IEC support as well (but that wasn't documented):

>>> from hurry.filesize import size, iec>>> size(11000, system=iec)'10Ki'>>> size(198283722, system=iec)'189Mi'

Because it's written by the Awesome Martijn Faassen, the code is small, clear and extensible. Writing your own systems is dead easy.

Here is one:

mysystem = [    (1024 ** 5, ' Megamanys'),    (1024 ** 4, ' Lotses'),    (1024 ** 3, ' Tons'),     (1024 ** 2, ' Heaps'),     (1024 ** 1, ' Bunches'),    (1024 ** 0, ' Thingies'),    ]

Used like so:

>>> from hurry.filesize import size>>> size(11000, system=mysystem)'10 Bunches'>>> size(198283722, system=mysystem)'189 Heaps'


Instead of a size divisor of 1024 * 1024 you could use the << bitwise shifting operator, i.e. 1<<20 to get megabytes, 1<<30 to get gigabytes, etc.

In the simplest scenario you can have e.g. a constant MBFACTOR = float(1<<20) which can then be used with bytes, i.e.: megas = size_in_bytes/MBFACTOR.

Megabytes are usually all that you need, or otherwise something like this can be used:

# bytes pretty-printingUNITS_MAPPING = [    (1<<50, ' PB'),    (1<<40, ' TB'),    (1<<30, ' GB'),    (1<<20, ' MB'),    (1<<10, ' KB'),    (1, (' byte', ' bytes')),]def pretty_size(bytes, units=UNITS_MAPPING):    """Get human-readable file sizes.    simplified version of https://pypi.python.org/pypi/hurry.filesize/    """    for factor, suffix in units:        if bytes >= factor:            break    amount = int(bytes / factor)    if isinstance(suffix, tuple):        singular, multiple = suffix        if amount == 1:            suffix = singular        else:            suffix = multiple    return str(amount) + suffixprint(pretty_size(1))print(pretty_size(42))print(pretty_size(4096))print(pretty_size(238048577))print(pretty_size(334073741824))print(pretty_size(96995116277763))print(pretty_size(3125899904842624))## [Out] ###########################1 byte42 bytes4 KB227 MB311 GB88 TB2 PB