111 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
 | 
						|
traditional = [
 | 
						|
    (1024 ** 5, 'P'),
 | 
						|
    (1024 ** 4, 'T'), 
 | 
						|
    (1024 ** 3, 'G'), 
 | 
						|
    (1024 ** 2, 'M'), 
 | 
						|
    (1024 ** 1, 'K'),
 | 
						|
    (1024 ** 0, 'B'),
 | 
						|
    ]
 | 
						|
 | 
						|
alternative = [
 | 
						|
    (1024 ** 5, ' PB'),
 | 
						|
    (1024 ** 4, ' TB'), 
 | 
						|
    (1024 ** 3, ' GB'), 
 | 
						|
    (1024 ** 2, ' MB'), 
 | 
						|
    (1024 ** 1, ' KB'),
 | 
						|
    (1024 ** 0, (' byte', ' bytes')),
 | 
						|
    ]
 | 
						|
 | 
						|
verbose = [
 | 
						|
    (1024 ** 5, (' petabyte', ' petabytes')),
 | 
						|
    (1024 ** 4, (' terabyte', ' terabytes')), 
 | 
						|
    (1024 ** 3, (' gigabyte', ' gigabytes')), 
 | 
						|
    (1024 ** 2, (' megabyte', ' megabytes')), 
 | 
						|
    (1024 ** 1, (' kilobyte', ' kilobytes')),
 | 
						|
    (1024 ** 0, (' byte', ' bytes')),
 | 
						|
    ]
 | 
						|
 | 
						|
iec = [
 | 
						|
    (1024 ** 5, 'Pi'),
 | 
						|
    (1024 ** 4, 'Ti'),
 | 
						|
    (1024 ** 3, 'Gi'), 
 | 
						|
    (1024 ** 2, 'Mi'), 
 | 
						|
    (1024 ** 1, 'Ki'),
 | 
						|
    (1024 ** 0, ''),
 | 
						|
    ]
 | 
						|
 | 
						|
si = [
 | 
						|
    (1000 ** 5, 'P'),
 | 
						|
    (1000 ** 4, 'T'), 
 | 
						|
    (1000 ** 3, 'G'), 
 | 
						|
    (1000 ** 2, 'M'), 
 | 
						|
    (1000 ** 1, 'K'),
 | 
						|
    (1000 ** 0, 'B'),
 | 
						|
    ]
 | 
						|
 | 
						|
 | 
						|
 | 
						|
def size(bytes, system=traditional):
 | 
						|
    """Human-readable file size.
 | 
						|
 | 
						|
    Using the traditional system, where a factor of 1024 is used::
 | 
						|
    
 | 
						|
    >>> size(10)
 | 
						|
    '10B'
 | 
						|
    >>> size(100)
 | 
						|
    '100B'
 | 
						|
    >>> size(1000)
 | 
						|
    '1000B'
 | 
						|
    >>> size(2000)
 | 
						|
    '1K'
 | 
						|
    >>> size(10000)
 | 
						|
    '9K'
 | 
						|
    >>> size(20000)
 | 
						|
    '19K'
 | 
						|
    >>> size(100000)
 | 
						|
    '97K'
 | 
						|
    >>> size(200000)
 | 
						|
    '195K'
 | 
						|
    >>> size(1000000)
 | 
						|
    '976K'
 | 
						|
    >>> size(2000000)
 | 
						|
    '1M'
 | 
						|
    
 | 
						|
    Using the SI system, with a factor 1000::
 | 
						|
 | 
						|
    >>> size(10, system=si)
 | 
						|
    '10B'
 | 
						|
    >>> size(100, system=si)
 | 
						|
    '100B'
 | 
						|
    >>> size(1000, system=si)
 | 
						|
    '1K'
 | 
						|
    >>> size(2000, system=si)
 | 
						|
    '2K'
 | 
						|
    >>> size(10000, system=si)
 | 
						|
    '10K'
 | 
						|
    >>> size(20000, system=si)
 | 
						|
    '20K'
 | 
						|
    >>> size(100000, system=si)
 | 
						|
    '100K'
 | 
						|
    >>> size(200000, system=si)
 | 
						|
    '200K'
 | 
						|
    >>> size(1000000, system=si)
 | 
						|
    '1M'
 | 
						|
    >>> size(2000000, system=si)
 | 
						|
    '2M'
 | 
						|
    
 | 
						|
    """
 | 
						|
    for factor, suffix in system:
 | 
						|
        if bytes >= factor:
 | 
						|
            break
 | 
						|
    amount = int(bytes/factor)
 | 
						|
    if isinstance(suffix, tuple):
 | 
						|
        singular, multiple = suffix
 | 
						|
        if amount == 1:
 | 
						|
            suffix = singular
 | 
						|
        else:
 | 
						|
            suffix = multiple
 | 
						|
    return str(amount) + suffix
 | 
						|
 |