用Python转换文件大小的更好方法

2024-05-13 05:48:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的库读取文件并返回其字节大小。

然后,这个文件大小将显示给最终用户;为了让他们更容易理解它,我将文件大小显式地转换为MB,方法是将其除以1024.0 * 1024.0。当然可以,但我想知道是否有更好的方法在Python中实现这一点?

我的意思是,也许stdlib函数可以根据我想要的类型控制大小。就像我指定MB,它会自动除以1024.0 * 1024.0。有什么线索。


Tags: 文件方法函数类型字节mbstdlib线索
3条回答

有一个hurry.filesize将以字节为单位获取大小,并生成一个很好的字符串。

>>> from hurry.filesize import size
>>> size(11000)
'10K'
>>> size(198283722)
'189M'

或者如果您想要1K==1000(这是大多数用户的假设):

>>> from hurry.filesize import size, si
>>> size(11000, system=si)
'11K'
>>> size(198283722, system=si)
'198M'

它也有IEC支持(但没有记录在案):

>>> from hurry.filesize import size, iec
>>> size(11000, system=iec)
'10Ki'
>>> size(198283722, system=iec)
'189Mi'

因为它是由令人敬畏的Martijn Faassen编写的,所以代码很小、清晰且可扩展。编写自己的系统非常简单。

这里有一个:

mysystem = [
    (1024 ** 5, ' Megamanys'),
    (1024 ** 4, ' Lotses'),
    (1024 ** 3, ' Tons'), 
    (1024 ** 2, ' Heaps'), 
    (1024 ** 1, ' Bunches'),
    (1024 ** 0, ' Thingies'),
    ]

像这样使用:

>>> from hurry.filesize import size
>>> size(11000, system=mysystem)
'10 Bunches'
>>> size(198283722, system=mysystem)
'189 Heaps'

代替大小因子1024 * 1024,您可以使用<<bitwise shifting operator,即1<<20获得兆字节,1<<30获得千兆字节,等等

在最简单的情况下,可以有一个常量MBFACTOR = float(1<<20),然后可以与字节一起使用,即:megas = size_in_bytes/MBFACTOR

兆字节通常是您所需要的全部,或者可以使用类似的内容:

# bytes pretty-printing
UNITS_MAPPING = [
    (1<<50, ' PB'),
    (1<<40, ' TB'),
    (1<<30, ' GB'),
    (1<<20, ' MB'),
    (1<<10, ' KB'),
    (1, (' byte', ' bytes')),
]


def pretty_size(bytes, units=UNITS_MAPPING):
    """Get human-readable file sizes.
    simplified version of https://pypi.python.org/pypi/hurry.filesize/
    """
    for factor, suffix in units:
        if bytes >= factor:
            break
    amount = int(bytes / factor)

    if isinstance(suffix, tuple):
        singular, multiple = suffix
        if amount == 1:
            suffix = singular
        else:
            suffix = multiple
    return str(amount) + suffix

print(pretty_size(1))
print(pretty_size(42))
print(pretty_size(4096))
print(pretty_size(238048577))
print(pretty_size(334073741824))
print(pretty_size(96995116277763))
print(pretty_size(3125899904842624))

## [Out] ###########################
1 byte
42 bytes
4 KB
227 MB
311 GB
88 TB
2 PB

我用的是:

import math

def convert_size(size_bytes):
   if size_bytes == 0:
       return "0B"
   size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
   i = int(math.floor(math.log(size_bytes, 1024)))
   p = math.pow(1024, i)
   s = round(size_bytes / p, 2)
   return "%s %s" % (s, size_name[i])

注意:大小应以字节为单位发送。

相关问题 更多 >