# -*- coding: utf-8 -*-
MAGNITUDE_OF_DATA = {
i: v for i, v in enumerate(["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"])
}
[docs]def repr_data_size(
size_in_bytes,
precision=2,
):
"""
Return human readable string represent of a file size. Doesn't support
size greater than 1YB.
For example:
- 100 bytes => 100 B
- 100,000 bytes => 97.66 KB
- 100,000,000 bytes => 95.37 MB
- 100,000,000,000 bytes => 93.13 GB
- 100,000,000,000,000 bytes => 90.95 TB
- 100,000,000,000,000,000 bytes => 88.82 PB
- and more ...
Magnitude of data::
1000 kB kilobyte
1000 ** 2 MB megabyte
1000 ** 3 GB gigabyte
1000 ** 4 TB terabyte
1000 ** 5 PB petabyte
1000 ** 6 EB exabyte
1000 ** 7 ZB zettabyte
1000 ** 8 YB yottabyte
:type size_in_bytes: int
:type precision: int
:rtype: str
"""
if size_in_bytes < 1024:
return "%s B" % size_in_bytes
index = 0
while 1:
index += 1
size_in_bytes, mod = divmod(size_in_bytes, 1024)
if size_in_bytes < 1024:
break
template = "{0:.%sf} {1}" % precision
s = template.format(size_in_bytes + mod / 1024.0, MAGNITUDE_OF_DATA[index])
return s