Ho bisogno di convertire stringhe che contengono l'utilizzo della memoria in byte, come ad esempio: 1048576
(che è 1M) esattamente in quella, una versione leggibile dall'uomo e visa-versa.byte a lettura umana e ritorno. senza perdita di dati
Nota: Ho guardato già qui: Reusable library to get human readable version of file size?
E qui (anche se non è python): How to convert human readable memory size into bytes?
Nulla fino ad ora mi ha aiutato, così ho guardato altrove.
Ho trovato qualcosa che fa questo per me qui: http://code.google.com/p/pyftpdlib/source/browse/trunk/test/bench.py?spec=svn984&r=984#137 o, per brevi URL: http://goo.gl/zeJZl
Il Codice:
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)
E anche una funzione per la conversione nella direzione opposta (stesso sito) :
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])
Questo è grande e tutto, ma ha una certa perdita di informazioni, ad esempio:
>>> bytes2human(10000)
'9K'
>>> human2bytes('9K')
9216
Per cercare di risolvere questo, a cambiare la formattazione sulla funzione bytes2human
Into: format="%(value).3f%(symbol)s")
che è più bello, che mi dà questi risultati:
>>> bytes2human(10000)
'9.766K'
ma quando Provo a riconvertirli con la funzione human2bytes
:
>>> 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
Questo è a causa del .
Quindi la mia domanda è: come posso convertire una versione leggibile di nuovo in byte-versione, senza perdita di dati?
Nota: so che 3 decimali è anche un po 'di perdita di dati. Ma ai fini di questa domanda, ignoriamo che per ora, posso sempre cambiarlo in qualcosa di più grande.
+1 per l'aumento del punto circa preciso valore a virgola mobile. Fondamentalmente non puoi eseguire una traduzione simmetrica tra i due: la forma leggibile dall'uomo tronca i valori per brevità. – synthesizerpatel