zhasm
5/21/2012 - 9:50 AM

convert Bytes into human-readable format

convert Bytes into human-readable format

#!/usr/bin/env python

'''
usage: sz [-h] [--unit UnitOutput] N [N ...]

Input integer Bites, Output Human-Readable Size.

positional arguments:
  N

optional arguments:
  -h, --help            show this help message and exit
  --unit UnitOutput, -u UnitOutput
                        Available Units: B, K, M, G, T, P, E, Z, Y; Can be in
                        Upper/Lower Cases. If not provided, an appropriate
                        unit will be used.

'''

def formatter(size, unit):
    unit_names=['b', 'k', 'm', 'g', 't', 'p', 'e', 'z', 'y']
    u={}

    for i in range(len(unit_names)):
        u[unit_names[i]]=1024**i

    def _name(u):
        return 'Byte' if u=='b' else u.upper()+'B'

    if unit:
        return "%.02f %s" % (size * 1.0 / (u[unit]), _name(unit))

    else:
        index=0
        while size >= 1024 and index<len(unit_names)-1:
            size /= 1024.0
            index +=1

        return "%.02f %s" % (size, _name(unit_names[index]))

def parse():

    import argparse
    parser = argparse.ArgumentParser(description='Input integer Bites, Output Human-Readable Size.')
    parser.add_argument('byte', metavar='N', type=int, nargs='+')
    parser.add_argument('--unit', '-u', metavar='UnitOutput', type=str, default="",
            help="Available Units: B, K, M, G, T, P, E, Z, Y; Can be in Upper/Lower Cases. If not provided, an appropriate unit will be used.")
    args = parser.parse_args()
    return args

def process():
    args=parse()
    n=args.byte
    unit=args.unit
    for i in n:
        print  formatter(i, unit)

def main():
    process()

if __name__=='__main__':
    main()