40 lines
1.5 KiB
Python
40 lines
1.5 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""Bits & Bytes related humanization."""
|
|
|
|
suffixes = {
|
|
'decimal': ('kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'),
|
|
'binary': ('KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'),
|
|
'gnu': "KMGTPEZY",
|
|
}
|
|
|
|
|
|
def naturalsize(value, binary=False, gnu=False, format='%.1f'):
|
|
"""Format a number of byteslike a human readable filesize (eg. 10 kB). By
|
|
default, decimal suffixes (kB, MB) are used. Passing binary=true will use
|
|
binary suffixes (KiB, MiB) are used and the base will be 2**10 instead of
|
|
10**3. If ``gnu`` is True, the binary argument is ignored and GNU-style
|
|
(ls -sh style) prefixes are used (K, M) with the 2**10 definition.
|
|
Non-gnu modes are compatible with jinja2's ``filesizeformat`` filter."""
|
|
if gnu: suffix = suffixes['gnu']
|
|
elif binary: suffix = suffixes['binary']
|
|
else: suffix = suffixes['decimal']
|
|
|
|
base = 1024 if (gnu or binary) else 1000
|
|
bytes = float(value)
|
|
|
|
if bytes == 1 and not gnu: return '1 Byte'
|
|
elif bytes < base and not gnu: return '%d Bytes' % bytes
|
|
elif bytes < base and gnu: return '%dB' % bytes
|
|
|
|
for i,s in enumerate(suffix):
|
|
unit = base ** (i+2)
|
|
if bytes < unit and not gnu:
|
|
return (format + ' %s') % ((base * bytes / unit), s)
|
|
elif bytes < unit and gnu:
|
|
return (format + '%s') % ((base * bytes / unit), s)
|
|
if gnu:
|
|
return (format + '%s') % ((base * bytes / unit), s)
|
|
return (format + ' %s') % ((base * bytes / unit), s)
|
|
|