我需要将包含内存使用情况的字符串以字节为单位进行转换,如:1048576
(即1M),正好是一个人类可读的版本,反之亦然。字节给人可读,并返回。没有数据丢失
注:我已经看了这里: Reusable library to get human readable version of file size?
和这里(即使它不是蟒蛇): How to convert human readable memory size into bytes?
没有到目前为止帮助了我,让我看着别处。
我已经找到了,在这里做到这一点对我来说: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位也有点数据丢失。但为了这个问题的目的,现在让我们忽略它,我总是可以将它改变成更大的东西。
+1:复制在这里为后人
的代码。您基本上不能在两者之间执行对称翻译 - 为了简洁起见,人类可读形式会截断值。 – synthesizerpatel