Skip to content

Instantly share code, notes, and snippets.

@oprypin
Created March 19, 2015 23:02
Show Gist options
  • Save oprypin/f42974eab279bfb2e203 to your computer and use it in GitHub Desktop.
Save oprypin/f42974eab279bfb2e203 to your computer and use it in GitHub Desktop.
import itertools
def readable_size(nbytes, i=True):
sizes = ("B KiB MiB GiB TiB" if i else "B KB MB GB TB").split()
last = sizes[-1]
d = 1024 if i else 1000
for sz in sizes:
if nbytes < d or sz is last:
return '{} {}'.format(format(nbytes, '.1f').rstrip('0').rstrip('.'), sz)
nbytes /= d
sizes = ['B', 'kB KB KiB', 'MB Mb MiB', 'GB GiB', 'TB TiB']
sizes = sorted(
(itertools.chain((sz, i) for i, szs in enumerate(sizes) for sz in szs.split())),
key=lambda kv: len(kv[0]), reverse=True
)
def parse_size(size_string, i=True):
s = size_string.strip()
for size, value in sizes:
if s.endswith(size):
r = s[:-len(size)].strip()
r = float(r.replace(',', '.'))
if i or 'i' in size:
r *= 1024**value
else:
r *= 1000**value
return round(r)
else:
raise ValueError(size_string)
for s in "100MB 23KB 2GB 51.2MB".split():
print(s, parse_size(s), readable_size(parse_size(s)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment