获取文件的实际磁盘空间

Ale*_*lex 14 python

如何在python中获取磁盘上的实际文件大小?(它在硬盘上的实际大小).

Gia*_*olà 16

仅限UNIX:

import os
from collections import namedtuple

_ntuple_diskusage = namedtuple('usage', 'total used free')

def disk_usage(path):
    """Return disk usage statistics about the given path.

    Returned valus is a named tuple with attributes 'total', 'used' and
    'free', which are the amount of total, used and free space, in bytes.
    """
    st = os.statvfs(path)
    free = st.f_bavail * st.f_frsize
    total = st.f_blocks * st.f_frsize
    used = (st.f_blocks - st.f_bfree) * st.f_frsize
    return _ntuple_diskusage(total, used, free)
Run Code Online (Sandbox Code Playgroud)

用法:

>>> disk_usage('/')
usage(total=21378641920, used=7650934784, free=12641718272)
>>>
Run Code Online (Sandbox Code Playgroud)

编辑1 - 也适用于Windows:https://code.activestate.com/recipes/577972-disk-usage/?in = user-4178764

编辑2 - 这也可以在Python 3.3+中找到:https://docs.python.org/3/library/shutil.html#shutil.disk_usage


hft*_*hft 5

使用os.stat(filename).st_size来获取文件的逻辑大小.使用os.statvfs(filename).f_bsize获取文件系统块大小.然后使用整数除法计算磁盘上的正确大小,如下所示:

num_blocks = os.stat(filename).st_blocks
block_size = os.statvfs(filename).f_bsize
sizeOnDisk = num_blocks*block_size
Run Code Online (Sandbox Code Playgroud)

  • `((lSize-1)/ bSize + 1)*bSize)`可能稍微准确一些.感谢您纠正我古老而错误的答案. (4认同)

Jon*_*art 5

这是在st_blocks设置的平台上在磁盘上获取文件大小的正确方法:

import os

def size_on_disk(path):
    st = os.stat(path)
    return st.st_blocks * 512
Run Code Online (Sandbox Code Playgroud)

表示乘以os.stat(path).st_blksizeos.vfsstat(path).f_bsize完全不正确的其他答案。

Python的文档os.stat_result.st_blocks很清楚地指出:

st_blocks
为文件分配的 512 字节块数。st_size当文件有孔时,这可能小于/512。

此外,stat(2)手册页也说了同样的话:

blkcnt_t  st_blocks;      /* Number of 512B blocks allocated */
Run Code Online (Sandbox Code Playgroud)


eph*_*ent 2

st = os.stat(\xe2\x80\xa6)\ndu = st.st_blocks * st.st_blksize\n
Run Code Online (Sandbox Code Playgroud)\n

  • 小心,这是错误的!在 Linux 上,“st.st_blocks”*始终*以 512 字节为单位,而“st.st_blksize”是文件系统块大小(通常为 4096 字节)。真正的用法是`st.st_blocks * 512`。有关详细信息,请参阅http://linux.die.net/man/2/stat。 (12认同)