非常に便利だと思いhurry.filesize
ますが、10 進数で出力されませんか?
例えば:
print size(4026, system=alternative) gives 3 KB.
しかし、後ですべての値を追加すると、正確な合計が得られません。たとえば、出力がhurry.filesize
4 つの変数にあり、各値が 3 の場合、それらをすべて追加すると、出力は 15 になります。
出力を小数で取得するためのrush.filesizeの代替を探しています。
非常に便利だと思いhurry.filesize
ますが、10 進数で出力されませんか?
例えば:
print size(4026, system=alternative) gives 3 KB.
しかし、後ですべての値を追加すると、正確な合計が得られません。たとえば、出力がhurry.filesize
4 つの変数にあり、各値が 3 の場合、それらをすべて追加すると、出力は 15 になります。
出力を小数で取得するためのrush.filesizeの代替を探しています。
これを自分で実装するのはそれほど難しくありません:
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'
免責事項: これから説明するパッケージを作成しました
モジュールbitmathは、説明した機能をサポートしています。また、@filmore によって作成された、意味的にNIST ユニット プレフィックス (SI ではなく)、つまり MB ではなく MiB を使用する必要があるというコメントにも対応しています。丸めもサポートされるようになりました。
あなたは最初に次のことについて質問しました:
print size(4026, system=alternative)
ビットマスでは、デフォルトのプレフィックス単位システムは NIST (1024 ベース) であるため、4026バイトを参照していると仮定すると、ビットマスでの同等のソリューションは次のいずれかのようになります。
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
現在、この方法を使用するときに、ユーザーが優先プレフィックス単位システムを選択できるようにするための未解決のタスクbest_prefix
があります。
更新: 2014-07-16最新のパッケージがPyPiにアップロードされ、いくつかの新機能が含まれています (完全な機能リストはGitHub ページにあります) 。
これは、@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 少ないという事実に基づいて機能します。残りはかなり簡単です。