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