基于Python實(shí)現(xiàn)文件大小輸出
在數(shù)據(jù)庫中存儲(chǔ)時(shí),使用 Bytes 更精確,可擴(kuò)展性和靈活性都很高。
輸出時(shí),需要做一些適配。
1. 注意事項(xiàng)與測(cè)試代碼
1.需要考慮 sizeInBytes 為 None 的場(chǎng)景。
2.除以 1024.0 而非 1024,避免丟失精度。
實(shí)現(xiàn)的函數(shù)為 getSizeInMb(sizeInBytes),通用的測(cè)試代碼為
def getSizeInMb(sizeInBytes): return 0 def test(sizeInBytes): print '%s -> %s' % (sizeInBytes, getSizeInMb(sizeInBytes)) test(None) test(0) test(10240000) test(1024*1024*10)
2. 以 MB 為單位輸出 -- 返回 float
通常,電子書的大小在 1 - 50MB 之間,輸出時(shí)統(tǒng)一轉(zhuǎn)為 MB 是不錯(cuò)的選擇。
弊端:
1.輸出精度過高,比如 10240000 Bytes 計(jì)算結(jié)果為 10240000 -> 9.765625
2.文件大小有限制,小于 1 MB 或 G 級(jí)數(shù)據(jù)不適合該方式展示
優(yōu)勢(shì):
1.適合于用返回值參與計(jì)算
def getSizeInMb(sizeInBytes): return (sizeInBytes or 0) / (1024.0*1024.0)
3. 以 MB 為單位保留 1 位小數(shù) -- 返回 str
處于精度問題考慮,可以選擇保留 1 位小數(shù)。
def getSizeInMb(sizeInBytes):
return '%.1f' % ((sizeInBytes or 0) / (1024.0*1024.0), ) # use 1-dimension tuple is suggested
返回值建議寫成 '%.1f' % (number,) 而非 '%.1f' % (number)
二者均能正確執(zhí)行,但后者容易被誤判為執(zhí)行只有一個(gè)參數(shù) number 的函數(shù),導(dǎo)致難以判斷的錯(cuò)誤。
3. 以 MB 為單位保留至多 1 位小數(shù) -- 返回 str
大多數(shù)操作系統(tǒng)一般展示至多 1 位小數(shù)
def getSizeInMb(sizeInBytes):
sizeInMb = '%.1f' % ((sizeInBytes or 0) / (1024.0*1024.0), ) # use 1-dimension tuple is suggested
return sizeInMb[:-2] if sizeInMb.endswith('.0') else sizeInMb # python2.5+ required
4. 自動(dòng)選擇最佳單位
def getSizeInNiceString(sizeInBytes):
"""
Convert the given byteCount into a string like: 9.9bytes/KB/MB/GB
"""
for (cutoff, label) in [(1024*1024*1024, "GB"),
(1024*1024, "MB"),
(1024, "KB"),
]:
if sizeInBytes >= cutoff:
return "%.1f %s" % (sizeInBytes * 1.0 / cutoff, label)
if sizeInBytes == 1:
return "1 byte"
else:
bytes = "%.1f" % (sizeInBytes or 0,)
return (bytes[:-2] if bytes.endswith('.0') else bytes) + ' bytes'
算法說明:
1. 從英語語法角度,只有 1 使用單數(shù)形式。其他 0/小數(shù) 均使用復(fù)數(shù)形式。涉及 bytes 級(jí)別
2. 精度方面,KB 及以上級(jí)別,保留 1 位小數(shù)。bytes 保留至多 1 位小數(shù)。
這種處理規(guī)則,不適合于小數(shù)十分位為 0 的情況,比如 10.0 bytes,10.01 bytes。輸入結(jié)果均為 10 bytes。
其他情況下,精度均不存在問題。
測(cè)試數(shù)據(jù)與結(jié)果如下圖

以上內(nèi)容給大家介紹了基于Python實(shí)現(xiàn)文件大小輸出的相關(guān)知識(shí),希望本文分享對(duì)大家有所幫助。
相關(guān)文章
Python實(shí)現(xiàn)生成簡(jiǎn)單的Makefile文件代碼示例
這篇文章主要介紹了Python實(shí)現(xiàn)生成簡(jiǎn)單的Makefile文件代碼示例,本文給出了兩段實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-03-03
Python3.6連接Oracle數(shù)據(jù)庫的方法詳解
這篇文章主要介紹了Python3.6連接Oracle數(shù)據(jù)庫的方法,較為詳細(xì)的分析了cx_Oracle模塊安裝及Python3.6使用cx_Oracle模塊操作Oracle數(shù)據(jù)庫的具體操作步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下2018-05-05
基于Python編寫簡(jiǎn)單的網(wǎng)絡(luò)測(cè)試工具
這篇文章主要為大家詳細(xì)介紹了如何基于Python編寫一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)測(cè)試工具,可以測(cè)試網(wǎng)絡(luò)的下載速度,上傳速度和延遲,感興趣的可以了解下2025-02-02
python數(shù)據(jù)擬合之scipy.optimize.curve_fit解讀
這篇文章主要介紹了python數(shù)據(jù)擬合之scipy.optimize.curve_fit解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
python json load json 數(shù)據(jù)后出現(xiàn)亂序的解決方案
今天小編就為大家分享一篇python json load json 數(shù)據(jù)后出現(xiàn)亂序的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02
django foreignkey外鍵使用的例子 相當(dāng)于left join
今天小編就為大家分享一篇django foreignkey外鍵使用的例子 相當(dāng)于left join,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08

