Skip to content

Instantly share code, notes, and snippets.

@varjmes
Created December 28, 2014 12:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save varjmes/dd2d3f4ba7207242251c to your computer and use it in GitHub Desktop.
Save varjmes/dd2d3f4ba7207242251c to your computer and use it in GitHub Desktop.
humansize.py
SUFFIXES = {1000: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
1024: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']}
def approximate_size(size, a_kilobyte_is_1024_bytes=True):
"""Convert a file size to human-readable form.
Keyword arguments:
size -- file size in bytes
a_kilobyte_is_1024_bytes -- if True (default), use multiples of 1024,
if False, use multiples of 1000
Returns: string
"""
if size < 0:
raise ValueError("Number must be non-negative")
multiple = 1024 if a_kilobyte_is_1024_bytes else 1000
for suffix in SUFFIXES[multiple]:
size /= multiple
if size < multiple:
return "{0:.1f} {1}".format(size, suffix)
"""
Can someone tell me how the above for loop selects the correct suffix? It does it as if by magic.
I understand how everything else works, but don't understand how the right suffix within the list
is selected.
"""
raise ValueError("Number too large")
if __name__ == "__main__":
print(approximate_size(1000000000000, False))
print(approximate_size(1000000000000))
@junklight
Copy link

interestingly my version and yours both have the same bug - they don't test to see if they've 'run off the end'

I guess I've never used mine with petabytes & yours at least has a pretty high top end

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment