code: def humanize_bytes(bytes, precision=1):
      
      abbrevs = (
          (1<<50, 'PB'),
          (1<<40, 'TB'),
          (1<<30, 'GB'),
          (1<<20, 'MB'),
          (1<<10, 'kB'),
          (1, 'bytes')
      )
      if bytes == 1:
          return '1 byte'
      for factor, suffix in abbrevs:
          if bytes >= factor:
              break
      return '%.*f %s' % (precision, bytes / factor, suffix)
docs: Return a humanized string representation of a number of bytes.
  
      Assumes `from __future__ import division`.
  
      >>> humanize_bytes(1)
      '1 byte'
      >>> humanize_bytes(1024)
      '1.0 kB'
      >>> humanize_bytes(1024*123)
      '123.0 kB'
      >>> humanize_bytes(1024*12342)
      '12.1 MB'
      >>> humanize_bytes(1024*12342,2)
      '12.05 MB'
      >>> humanize_bytes(1024*1234,2)
      '1.21 MB'
      >>> humanize_bytes(1024*1234*1111,2)
      '1.31 GB'
      >>> humanize_bytes(1024*1234*1111,1)
      '1.3 GB'