From 45d817b0f867d9f0ede61a5996f5e17d2a62bea8 Mon Sep 17 00:00:00 2001 From: Mark Pilgrim Date: Tue, 27 Jan 2009 21:18:27 -0500 Subject: [PATCH] candidate for the all-important first chapter code sample --- humansize.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 humansize.py diff --git a/humansize.py b/humansize.py new file mode 100644 index 0000000..77db8ff --- /dev/null +++ b/humansize.py @@ -0,0 +1,36 @@ +from optparse import OptionParser + +SUFFIXES = ('KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB') +MULTIPLES = {True: 1024, False: 1000} + +def human_size(size, use_binary_multiples=True): + """Convert a file size to human-readable form. + + Keyword arguments: + size -- file size in bytes + use_binary_multiples -- if False, use multiples of 1000 + if True, use multiples of 1024 (default=True) + + Returns: string + + """ + multiple = MULTIPLES[use_binary_multiples] + for suffix in SUFFIXES: + size /= multiple + if size < multiple: + return "{0:.1f} {1}".format(size, suffix) + return "Too large to contemplate!" + +if __name__ == "__main__": + parser = OptionParser() + parser.add_option("-d", "--decimal", + action="store_false", + dest="binary_multiples", + default=True, + help="use multiples of 1000 instead of 1024") + (options, args) = parser.parse_args() + if args: + print(human_size(int(args[0]), options.binary_multiples)) + else: + parser.print_help() +