2017-06-01 1 views
1

Ich muss eine menschlich lesbare Notation der Upload-Größenbeschränkung (z. B. 100kb, 32MB, etc.) mit Python konvertieren. Der konvertierte Wert sollte als eine Anzahl von Bytes ausgedrückt werden.Konvertiere Größe Notation mit Einheiten (100kb, 32MB) in die Anzahl der Bytes in Python

Beispiel

convert_size_to_bytes("32MB") # should return 33554432 
convert_size_to_bytes("100kB") # should return 102400 
convert_size_to_bytes("123B") # should return 123 
convert_size_to_bytes("123") # should return 123 

Antwort

3

Die folgende Funktion macht den Job:

def convert_size_to_bytes(size): 
    multipliers = { 
     'kb': 1024, 
     'mb': 1024*1024, 
     'gb': 1024*1024*1024, 
     'tb': 1024*1024*1024*1024 
    } 

    for suffix in multipliers: 
     if size.lower().endswith(suffix): 
      return int(size[0:-len(suffix)]) * multipliers[suffix] 
    else: 
     if size.lower().endswith('b'): 
      return int(size[0:-1]) 

    try: 
     return int(size) 
    except ValueError: # for example "1024x" 
     print('Malformed input!') 
     exit() 

print(convert_size_to_bytes("32MB")) 
print(convert_size_to_bytes("100kB")) 
print(convert_size_to_bytes("123B")) 
print(convert_size_to_bytes("123")) 

Sie diese Funktion hier testen: http://ideone.com/kse773

Diese Funktion Verbesserungen erfordert eine einzelne Zeichengröße zu unterstützen Einheiten (zB B für Bytes). Als B ist ein Suffix des kB unterschiedlichen Ansatzes anzuwenden.

+2

Dies ist einer dieser seltenen Fälle, in denen ein 'else' auf der 'for'-Schleife sinnvoll wäre, um die einzelne' b 'zu erfassen. –

+1

@ Ev.Kounis Vielen Dank für die Bestätigung, dass 'else' in der 'for'-Schleife hier akzeptabel ist. Ich habe meine Antwort korrigiert. – Robson

+2

Und um es vollständig zu machen, möchten Sie vielleicht das letzte 'return' in einem' try' Block einkapseln wie: [this] (http://ideone.com/BMDb0V) –

3

eine Alternative mit regulärer Ausdruck und Ersatzfunktionen:

import re 

suffixes = "","k","m","g","t" 
multipliers = {'{}b'.format(l) : 1024**i for i,l in enumerate(suffixes) } 

sre = re.compile("(\d+)({})".format("|".join(x+"b" for x in suffixes)),re.IGNORECASE) 

def subfunc(m): 
    return str(int(m.group(1))*multipliers[m.group(2).lower()]) 

def convert_size_to_bytes(size): 
    return sre.sub(subfunc,size) 


print(convert_size_to_bytes("32MB")) 
print(convert_size_to_bytes("100kB")) 
print(convert_size_to_bytes("123")) 

Das Wörterbuch und die regulären Ausdrücke erzeugt, um die Einheit nach (so kann es zu EXA erweitert werden, PETA ...)

Bei übereinstimmende Ziffern + Einheit, ersetzt den Ausdruck durch die ausgewertete Ganzzahl für die erste Gruppe multipliziert mit dem Wert des Wörterbuchs), zurück in Zeichenfolge konvertiert, wie die re.sub Funktion erfordert.

Verwandte Themen