次のようなメモリ使用量をバイト単位で含む文字列1048576
(1M)を人間が読める形式に変換する必要があります。その逆も同様です。
注:私はすでにここを見ました: ファイルサイズの人間が読めるバージョンを取得するための再利用可能なライブラリ?
そしてここに(Pythonではありませんが): 人間が読めるメモリサイズをバイトに変換する方法は?
これまでのところ何も役に立たなかったので、他の場所を探しました。
私はここでこれを行う何かを見つけました:http ://code.google.com/p/pyftpdlib/source/browse/trunk/test/bench.py?spec = svn984&r = 984#137または、より短いURLの場合:http://goo.gl/zeJZl
コード:
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)
また、他の方法で変換するための関数(同じサイト):
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])
これは素晴らしいことですが、情報が失われます。例:
>>> bytes2human(10000)
'9K'
>>> human2bytes('9K')
9216
これを解決するために、関数のフォーマットを変更しますbytes2human
の中へ:format="%(value).3f%(symbol)s")
これははるかに優れており、次の結果が得られます。
>>> bytes2human(10000)
'9.766K'
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
これは.
だから私の質問は、データを失うことなく、人間が読める形式をバイトバージョンに戻すにはどうすればよいですか?
注:小数点以下3桁も、データが少し失われることを知っています。しかし、この質問の目的のために、今のところそれを無視しましょう、私はいつでもそれをもっと大きなものに変えることができます。