bajtów do odczytu dla ludzi iz powrotem. bez utraty danych

Muszę przekonwertować ciągi zawierające użycie pamięci w bajtach, takie jak:1048576 (co jest 1M) w dokładnie taką, wersję czytelną dla ludzi i odwrotnie.

Uwaga: Już tu spojrzałem:Biblioteka wielokrotnego użytku, aby uzyskać rozmiar pliku czytelny dla człowieka?

I tutaj (nawet jeśli nie jest to python):Jak przekonwertować rozmiar pamięci czytelnej dla człowieka na bajty?

Jak dotąd nic mi nie pomogło, więc spojrzałem gdzie indziej.

Znalazłem coś, co robi to dla mnie tutaj:http://code.google.com/p/pyftpdlib/source/browse/trunk/test/bench.py?spec=svn984&r=984#137 lub, w przypadku krótszego adresu URL:http://goo.gl/zeJZl

Kod:

def bytes2human(n, format="%(value)i%(symbol)s"):
    """
    >>> bytes2human(10000)
    '9K'
    >>> bytes2human(100001221)
    '95M'
    """
    symbols = ('B', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y')
    prefix = {}
    for i, s in enumerate(symbols[1:]):
        prefix[s] = 1 << (i+1)*10
    for symbol in reversed(symbols[1:]):
        if n >= prefix[symbol]:
            value = float(n) / prefix[symbol]
            return format % locals()
    return format % dict(symbol=symbols[0], value=n)

A także funkcja do konwersji w drugą stronę (ta sama strona):

def human2bytes(s):
    """
    >>> human2bytes('1M')
    1048576
    >>> human2bytes('1G')
    1073741824
    """
    symbols = ('B', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y')
    letter = s[-1:].strip().upper()
    num = s[:-1]
    assert num.isdigit() and letter in symbols
    num = float(num)
    prefix = {symbols[0]:1}
    for i, s in enumerate(symbols[1:]):
        prefix[s] = 1 << (i+1)*10
    return int(num * prefix[letter])

To jest świetne, ale ma pewne straty informacji, na przykład:

>>> bytes2human(10000)
'9K'
>>> human2bytes('9K')
9216

Aby spróbować rozwiązać ten problem, zmieniam formatowanie funkcjibytes2human

W:format="%(value).3f%(symbol)s")

Co jest o wiele przyjemniejsze, dając mi następujące wyniki:

>>> bytes2human(10000)
'9.766K'

ale kiedy próbuję je przekonwertowaćhuman2bytes funkcjonować:

>>> human2bytes('9.766K')

Traceback (most recent call last):
  File "<pyshell#366>", line 1, in <module>
    human2bytes('9.766K')
  File "<pyshell#359>", line 12, in human2bytes
    assert num.isdigit() and letter in symbols
AssertionError

To z powodu.

Moje pytanie brzmi: jak mogę przekonwertować wersję czytelną dla człowieka z powrotem na wersję bajtową, bez utraty danych?

Uwaga: Wiem, że 3 miejsca po przecinku to także trochę utraty danych. Ale dla celów tego pytania, zignorujmy to na razie, zawsze mogę to zmienić na coś większego.

questionAnswers(2)

yourAnswerToTheQuestion