我需要将包含以字节为单位的内存使用情况的字符串(例如:1048576
(1M))转换为人类可读的版本,反之亦然。
注意:我已经看过这里了: Reusable library to get human readable version of file size?
在这里(即使它不是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 位也有一点数据丢失。但是出于这个问题的目的,让我们暂时忽略这一点,我总是可以将其更改为更大的东西。