Python 获取文件的实际磁盘空间

Python 获取文件的实际磁盘空间,python,Python,如何在python中获得磁盘上的实际文件大小?(硬盘上的实际大小)。我不确定这是磁盘上的大小,还是逻辑大小: import os filename = "/home/tzhx/stuff.wev" size = os.path.getsize(filename) 如果它不是您要寻找的droid,您可以将其取整,方法是:除以集群大小(作为float),然后使用ceil,然后乘以。仅UNIX: st = os.stat(…) du = st.st_blocks * st.st_blksize i

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

我不确定这是磁盘上的大小,还是逻辑大小:

import os
filename = "/home/tzhx/stuff.wev"
size = os.path.getsize(filename)
如果它不是您要寻找的droid,您可以将其取整,方法是:除以集群大小(作为float),然后使用ceil,然后乘以。

仅UNIX:

st = os.stat(…)
du = st.st_blocks * st.st_blksize
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)
用法:

>>> disk_usage('/')
usage(total=21378641920, used=7650934784, free=12641718272)
>>>
编辑1-也适用于Windows:


编辑2-这在Python 3.3+中也可用:

更新2021-03-26:之前,我的答案将文件的逻辑大小四舍五入为块大小的整数倍。这种方法仅在文件以连续的块序列存储在磁盘上(或者除一个块外,所有块都已满)时有效。由于这是一种特殊情况(尽管对于小文件来说很常见),我更新了我的答案,使其更为普遍正确。但是,请注意,不幸的是,
statvfs
方法和
st_块
值在某些系统(例如Windows 10)上可能不可用

调用os.stat(filename).st_blocks以获取文件中的块数

调用os.statvfs(filename).f_bsize以获取文件系统块大小

然后计算磁盘上的正确大小,如下所示:

num_blocks = os.stat(filename).st_blocks
block_size = os.statvfs(filename).f_bsize
sizeOnDisk = num_blocks*block_size

要获取给定文件/文件夹的磁盘使用情况,可以执行以下操作:

import os

def disk_usage(path):
    """Return cumulative number of bytes for a given path."""
    # get total usage of current path
    total = os.path.getsize(path)
    # if path is dir, collect children
    if os.path.isdir(path):
        for file_name in os.listdir(path):
            child = os.path.join(path, file_name)
            # recursively get byte use for children
            total += disk_usage(child)
    return total
该函数递归收集嵌套在给定路径中的文件的字节使用情况,并返回整个路径的累积使用情况。
如果希望打印每个文件的信息,也可以在其中添加一个
打印“{path}:{bytes}”。format(path,total)

在设置了
st_块的平台上,以下是获取磁盘上文件大小的正确方法:

import os

def size_on_disk(path):
    st = os.stat(path)
    return st.st_blocks * 512
其他表示乘以
os.stat(path).st_blksize
os.vfsstat(path).f_bsize
的答案根本不正确

报告非常明确地指出:

st_块

为文件分配的512字节块数。当文件有洞时,该值可能小于
st_size
/512

此外,报告也说了同样的话:


你的意思是按集群大小进行调整?看看这个问题:@ruslik:没那么简单。考虑例如稀疏或压缩的文件,它们可以占用比它们的大小指示更少的空间。+ 1,没有意识到这是在<代码> OS中。STAT< <代码>!我正要把提问者介绍给他。不知道为什么我假设OP在Windows上:P“在某些Unix系统(如Linux)上,以下属性也可能可用:st_块(分配给文件的块数)、st_blksize(文件系统块大小)…”–即不可移植,您至少应该捕获当这些成员不可用时引发的异常。小心,这是错误的!在Linux上,
st.st_块
总是以512字节为单位,而
st.st_块
是一个文件系统块大小(通常为4096字节)。真正的用法是
st.st_blocks*512
。有关详细信息,请参阅。不,你们都错了:st.st_块并不总是以512字节为单位。在我的机器上,它的单位是1024(这确实很奇怪)。此外,答案是错误的,因为st_blksize不返回1024,它返回文件I/O块大小,例如,st_blksize在我的机器上返回65536。例如,在Windows 7上cygwin上运行python 2.7.8的dell笔记本电脑上,我创建了一个3000字节的文件(“dd if=/dev/zero bs=3000 count=1 of=./testfile.txt”)和:os.stat(“testfile.txt”).st_blocks=4;os.stat(“./testfile.txt”).st_blksize=65536;逻辑大小为3000,磁盘上为4096。我将在下面回答您是否可以更新您的答案以参考下面@hft的答案?当我在windows7、python 2.2中使用getsize()时,我确实得到了文件占用的实际空间。在我的例子中,我只需要“文件大小”而不是“文件空间”。我想知道你怎么才能得到文件大小
((lSize-1)/bSize+1)*bSize)
可能更精确一些。感谢您纠正我古老而错误的答案。
自2.6版以来已被弃用:Python 3中的statvfs模块已被删除。
:-(@danodonovan在Python 3中,
statvfs
模块似乎已被删除,但答案使用的是
os
模块。正如您所见,该模块显示,
os.statvfs
仍然存在,甚至在Python 3.6中更新为包含新功能。我遇到的情况是,在较大的文件中您的公式给出的值为1块(4096字节)小于du给我的值。例如,如果您使用命令
dd if=/dev/zero of=testsize bs=1 count=419472426
创建一个文件。换句话说,du使用--appearance size选项的结果之间的差异为7126,而不是4096。注意:du的--appearance size选项的值与我们获得的值匹配ing
os.stat(filename).st_size
。在运行多个测试后,在Windows 7上,这将返回实际大小,而不是磁盘上的大小。
blkcnt_t  st_blocks;      /* Number of 512B blocks allocated */