从字节计算人类可读文件大小的Python库?

从字节计算人类可读文件大小的Python库?,python,python-module,Python,Python Module,我发现harry.filesize非常有用,但它不提供十进制输出 例如: print size(4026, system=alternative) gives 3 KB. 但后来当我把所有的值相加时,我并没有得到确切的和。例如,如果harse.filesize的输出为4个变量,每个值为3。如果我把它们全部加起来,我得到的输出是15 我正在寻找hurse.filesize的替代方案,以获得小数输出 这其实并不难自己实现: suffixes = ['B', 'KB', 'MB', 'GB', 'T

我发现
harry.filesize
非常有用,但它不提供十进制输出

例如:

print size(4026, system=alternative) gives 3 KB.
但后来当我把所有的值相加时,我并没有得到确切的和。例如,如果
harse.filesize
的输出为4个变量,每个值为3。如果我把它们全部加起来,我得到的输出是15


我正在寻找hurse.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])

这没有必要比解决方案更快,只是稍微凉快了一点,如果我可以这么说的话:)


这是基于这样一个事实,即任何数字以10为底的对数的整数部分比实际位数少1。剩下的内容非常简单。

免责声明:我写了我将要描述的软件包

该模块支持您描述的功能。它还解决了@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
我目前有一个允许用户在使用
best_prefix
方法时选择首选前缀单位系统的选项


更新:2014-07-16最新的软件包已经上传到了,它包含了一些新功能(完整的功能列表已打开)

每次我写一个小脚本或ipynb或任何东西时,我都会重新发明轮子。它变得陈腐,所以我编写了python模块。我在这里发布这篇文章是因为我刚刚更新了它,哇,Python版本升级了

它是一个DataSize类,它是int的子类,所以算术可以工作,但是它从算术返回int,因为我将它与Pandas和一些numpy一起使用,我不想在矩阵数学库有pythonC++翻译时减慢速度

如果需要为使用SI或NIST后缀的嵌入式技术处理数据,您可以使用带有SI或NIST后缀(位或字节)的字符串构造DataSize对象,甚至可以使用wierd字长。DataSize对象具有直观的format()代码语法,用于人类可读的表示。在内部,该值只是8位字节的整数计数

例如


您是否尝试过
os.path.getsize()
?就是这样,但问题是:如果输出为4.12,则得到4.12,这很好,但是如果输出为4,则得到4.00。我只想要4是没有小数点。添加了
四舍五入
,这样你只能得到小数点后两位。有点迂腐,但你可能想使用KiB、MiB等…我碰巧非常不喜欢这些后缀。但是,由于代码非常清楚,如果你真的想改变,应该不难;)。。。。您将rank作为base-1000日志,而不是base-1024日志。为什么不改用
math.log(nbytes,1024)
?更明显的是,如果nbytes==0,则调用math.log10失败并显示“ValueError:math domain error”。您需要额外检查:
如果nbytes==0:return“0b”
我知道有些开发人员认为这是一项“太小的任务,不需要库”,但我不同意,因为这会导致开发人员不断地重新发明轮子。不管怎样,这个图书馆正是我要找的!谢谢蒂姆!这不是重新发明轮子,只是学习:)这些东西的包装都是胡说八道。一个片段就足够了。只包含一个方法的包正在污染存储库和依赖项。这是一种太多人会因为懒惰而使用的软件包,有一天作者决定改变一些东西…@romainincent拥有相同的代码副本并粘贴在可能的数千个项目上,这就是我所说的污染。特别是如果一个人后来碰巧发现了一个导致bug的极端情况,那么修复该代码的每个实例就是一场噩梦。例如,本文中的代码在最初发布4年后得到了改进。在这种情况下,这不是一个很大的变化,但它说明了这一点。不是所有在过去抄袭的人都会注意到有人做了改变。是的。但前提是你一开始不明白自己在做什么。这就是为什么像这样简单直接的东西会有bug的原因。这是一个数学公式,它不是通过复杂的协议进行通信,也不是处理。。。图书馆。你们称之为免费修复bug的可能性,我称之为有人在你们自己的代码中引入意外更改的危险。
print size(4026, system=alternative)
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
>>> from datasize import DataSize
>>> 'My new {:GB} SSD really only stores {:.2GiB} of data.'.format(DataSize('750GB'),DataSize(DataSize('750GB') * 0.8))
'My new 750GB SSD really only stores 558.79GiB of data.'