2013-02-21 75 views
9

我覺得hurry.filesize非常有用,但它不會給出十進制輸出?Python庫從字節計算人類可讀的文件大小?

例如:

print size(4026, system=alternative) gives 3 KB. 

但後來當我添加的所有值我沒有得到確切的總和。例如,如果hurry.filesize的輸出爲4個變量,每個值爲3.如果我將它們全部相加,則得到的輸出爲15.

我正在尋找hurry.filesize的替代方法以獲取小數點輸出。

+1

你試過'os.path.getsize ()'? – monkut 2013-02-21 07:13:24

回答

33

這是不是真的難以實現自己:

suffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'] 
def humansize(nbytes): 
    i = 0 
    while nbytes >= 1024 and i < len(suffixes)-1: 
     nbytes /= 1024. 
     i += 1 
    f = ('%.2f' % nbytes).rstrip('0').rstrip('.') 
    return '%s %s' % (f, suffixes[i]) 

例子:

>>> humansize(131) 
'131 B' 
>>> humansize(1049) 
'1.02 KB' 
>>> humansize(58812) 
'57.43 KB' 
>>> humansize(68819826) 
'65.63 MB' 
>>> humansize(39756861649) 
'37.03 GB' 
>>> humansize(18754875155724) 
'17.06 TB' 
+0

就是這樣,但問題是:如果輸出是4.12這使得4.12很好,但如果輸出是4,它會給出4.00。我只想要4是沒有小數。 – pynovice 2013-02-21 08:32:45

+0

增加了'round',這樣你只能得到兩位小數。 – nneonneo 2013-02-21 08:45:16

+3

有點迂腐,但你可能想要使用KiB,MiB等...... – filmor 2013-02-21 08:47:34

4

這是沒有必要比@nneonneo解決方案快,它只是有點冷卻器,如果我可以這樣說:)

import math 

suffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'] 

def human_size(nbytes): 
    human = nbytes 
    rank = 0 
    if nbytes != 0: 
    rank = int((math.log10(nbytes))/3) 
    rank = min(rank, len(suffixes) - 1) 
    human = nbytes/(1024.0 ** rank) 
    f = ('%.2f' % human).rstrip('0').rstrip('.') 
    return '%s %s' % (f, suffixes[rank]) 

這是基於這樣一個事實,即任何數字的以10爲底的對數的整數部分都小於實際的位數。其餘的很直截了當。

+1

您將排名作爲base-1000日誌而不是基本1024日誌。爲什麼不使用'math.log(nbytes,1024)'而不是?這是更明顯的是什麼。 – nneonneo 2015-06-08 16:13:07

+1

math.log10如果nbytes == 0,則調用將失敗,並顯示「ValueError:math domain error」。 您需要額外檢查: 'if nbytes == 0:return「0 B」' – foolo 2016-11-20 13:12:44

+0

@foolo我更新了答案:) – Lipis 2017-02-24 17:53:23

5

免責聲明:我寫的包,我將要描述的

模塊bitmath支持你所描述的功能。它還解決了@filmore所做的評論,在語義上我們應該使用NIST單元前綴(不是SI),也就是說,MiB而不是MB。 四捨五入現在也支持。

您最初問:

print size(4026, system=alternative) 

bitmath默認前綴單元系統是NIST(1024型),因此,假設你指的4026 字節,在相當於解決方案bitmath看起來像以下任何一項:

In [1]: import bitmath 

In [2]: print bitmath.Byte(bytes=4026).best_prefix() 
3.931640625KiB 

In [3]: human_prefix = bitmath.Byte(bytes=4026).best_prefix() 

In [4]: print human_prefix.format("{value:.2f} {unit}") 
3.93 KiB 

我現在有一個open task允許使用r使用best_prefix方法時選擇首選的前綴單位系統。

更新:2014年7月16日具有最新的軟件包被上傳到PyPi,它包括了一些新的功能(全功能列表是the GitHub page

+1

我知道一些開發人員認爲這是一個「需要一個圖書館的任務太小」,但我不同意,因爲這會導致開發人員不斷重複發明。無論如何,這個圖書館正是我一直在尋找的!謝謝蒂姆! – GheloAce 2016-03-09 07:51:50