मुझे स्ट्रिंग्स को कन्वर्ट करने की आवश्यकता है जिसमें बाइट्स में मेमोरी उपयोग होता है, जैसे: 1048576
(जो 1 एम है) बिल्कुल, एक मानव-पठनीय संस्करण, और वीजा-विपरीत।मानव पठनीय, और पीछे बाइट्स। डेटा हानि के बिना
नोट: मैं यहाँ पहले से ही देखा: 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