使用 python 的卷上剩余的跨平台空间

Cross-platform space remaining on volume using python

提问人: 提问时间:9/9/2008 更新时间:7/26/2022 访问量:48552

问:

我需要一种方法来确定磁盘卷上的剩余空间 在 linux、Windows 和 OS X 上使用 python。我目前正在解析各种系统调用(df、dir)的输出来实现这一目标 - 有没有更好的方法?

python windows linux macos 磁盘空间

评论

1赞 Giampaolo Rodolà 7/11/2012
在这里看到这个食谱: code.activestate.com/recipes/577972-disk-usage/?in=user-4178764

答:

1赞 Greg Hewgill 9/9/2008 #1

os.statvfs() 函数是获取类 Unix 平台(包括 OS X)信息的更好方法。Python 文档说“可用性:Unix”,但值得检查它是否也能在 Windows 上运行在您的 Python 版本中(即文档可能不是最新的)。

否则,可以使用 pywin32 库直接调用 GetDiskFreeSpaceEx 函数。

评论

3赞 jfs 9/30/2008
os.statvfs() 在 Windows 上不起作用(Python 2.5.2 -- 当前生产版本)。
0赞 hasseg 9/9/2008 #2

我不知道有任何跨平台方法可以实现这一点,但也许对你来说一个很好的解决方法是编写一个包装类来检查操作系统并为每个操作系统使用最佳方法。

对于 Windows,win32 扩展中有 GetDiskFreeSpaceEx 方法。

4赞 jfs 9/10/2008 #3

您可以将 df 用作跨平台方式。它是 GNU 核心实用程序的一部分。这些是预计存在于每个操作系统上的核心实用程序。但是,默认情况下,它们不会安装在 Windows 上(在这里,GetGnuWin32 派上用场)。

df 是一个命令行实用程序,因此是编写脚本所需的包装器。 例如:

from subprocess import PIPE, Popen

def free_volume(filename):
    """Find amount of disk space available to the current user (in bytes) 
       on the file system containing filename."""
    stats = Popen(["df", "-Pk", filename], stdout=PIPE).communicate()[0]
    return int(stats.splitlines()[1].split()[3]) * 1024

评论

4赞 ovgolovin 4/29/2014
我不明白为什么人们会投反对票。例如,这个答案可能对某人有用。无论如何,它是对其他 pupe-Pythonic 解决方案的良好补充。如果有人不喜欢这个答案,就没有理由投反对票。据我了解,反对票是彻头彻尾的错误答案。这个不是。
0赞 Erxin 4/24/2015
@ovgolovin 投票这个答案,最好知道另一种方法来做同样的事情。
10赞 Stefan Lundström 11/13/2009 #4

如果您不想添加其他依赖项,可以在 Windows 中使用 ctypes 直接调用 win32 函数调用。

import ctypes

free_bytes = ctypes.c_ulonglong(0)

ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(u'c:\\'), None, None, ctypes.pointer(free_bytes))

if free_bytes.value == 0:
   print 'dont panic'

评论

0赞 tale852150 1/28/2022
最后几行: if free_bytes.value == 0: print('don't panic') else: print(free_bytes.value)
79赞 Frankovskyi Bogdan 3/3/2010 #5
import ctypes
import os
import platform
import sys

def get_free_space_mb(dirname):
    """Return folder/drive free space (in megabytes)."""
    if platform.system() == 'Windows':
        free_bytes = ctypes.c_ulonglong(0)
        ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(dirname), None, None, ctypes.pointer(free_bytes))
        return free_bytes.value / 1024 / 1024
    else:
        st = os.statvfs(dirname)
        return st.f_bavail * st.f_frsize / 1024 / 1024

请注意,您必须传递目录名称才能正常工作 (适用于文件和目录)。您可以获取目录名称 从带有 .GetDiskFreeSpaceEx()statvfs()os.path.dirname()

另请参阅 os.statvfs()GetDiskFreeSpaceEx 的文档。

评论

13赞 jfs 4/26/2010
.f_bfree是文件系统中可用块的总数。它应该乘以得到字节数。.f_bsize
9赞 Dennis Bliefernicht 11/30/2011
至少在 OS X Lion / Python 2.7 上,我注意到乘以给出的值太大了,因为首选块大小是而基本块大小并给出了正确的值。在我的 linux 测试系统上,这两个值是相同的,因此应该一直有效。.f_bsizef_bsize.f_frsize.f_frsize
1赞 heltonbiker 9/5/2013
适用于在Android手机上获取可用磁盘,通过USB插入Windows系统,在Windows上运行脚本。伟大。
0赞 data 11/12/2013
@J.F.塞巴斯蒂安:这取决于你想要什么。Linux 可以为 root 保留空间。如果要包含此空间,请使用 f_bfree。如果要获取用户可用的块数,请使用f_bavail。也许有人可以说是否以及如何对待配额?
0赞 Steve Barnes 6/6/2014
我对上面有三个小问题:1/文档字符串是错误的,它以兆字节为单位返回空间&2/我从不喜欢看到多个返回语句,(我猜作为测试人员的时间太长了),所以会将结果存储在返回值中,3/整MB或十进制MB可能会对某些人产生影响。
6赞 Yuriy 7/21/2011 #6

一个好的跨平台方法是使用 psutil: http://pythonhosted.org/psutil/#disks(请注意,您需要 psutil 0.3.0 或更高版本)。

评论

0赞 Gringo Suave 1/16/2013
这将是最好的答案,但不幸的是,psutil 无法通过 pip 安装。
1赞 Tully 1/6/2015
psutil 现在可以从 pypi 和大多数其他来源(包括 Debian 软件包)获得。
30赞 Erxin 10/12/2013 #7

您可以将 wmi 模块用于 windows,将 os.statvfs 用于 unix

用于窗口

import wmi

c = wmi.WMI ()
for d in c.Win32_LogicalDisk():
    print( d.Caption, d.FreeSpace, d.Size, d.DriveType)

适用于 UNIX 或 Linux

from os import statvfs

statvfs(path)

评论

2赞 Craig Ringer 4/23/2015
我简直不敢相信我必须在这个问题上走多远才能找到提到 WMI 的人。所有这些疯狂的人使用 ctypes 直接调用 Windows C API,而他们只能使用 WMI?
1赞 Erxin 4/24/2015
@CraigRinger 是的,你是对的。我们应该使用正确的工具来做正确的事情。窗口的大多数常见管理任务已使用 wmi 中的 win api 包装。我们不必重新制作轮子。:^D
0赞 Fr0zenFyr 11/21/2015
为什么不处理它?psutil
2赞 DanGoodrick 3/16/2016
这就是我喜欢 stackoverflow 的原因。我什至不知道 WMI 模块,它运行完美。
1赞 ewerybody 11/14/2018
好吧,如果你想支持香草老式的python 2.7:你需要做这些事情。外部依赖越少越好。 是内置的!😐ctypes
34赞 jhasse 4/29/2015 #8

使用 安装 psutil。然后,您可以使用以下命令获取可用空间量(以字节为单位):pip install psutil

import psutil
print(psutil.disk_usage(".").free)

评论

2赞 jayatubi 6/1/2016
为什么这不是最好的答案?
2赞 jhasse 6/1/2016
我认为是因为 psutil 并不总是可以通过 pypi 获得。
0赞 smci 1/8/2019
我同意这是一个很好的答案。我将过时的链接固定为 .由于通常返回一个巨大的 64b 整数,我建议你也想向人们展示。 对我来说似乎更清楚......psutildisk_usage.freedisk_usage.percentpsutil.disk_usage(".").percent < 99.9
1赞 Sanjay Bhosale 3/8/2016 #9

以下代码在 Windows 上返回正确的值

import win32file    

def get_free_space(dirname):
    secsPerClus, bytesPerSec, nFreeClus, totClus = win32file.GetDiskFreeSpace(dirname)
    return secsPerClus * bytesPerSec * nFreeClus
6赞 Mišo 8/11/2016 #10

从 Python 3.3 开始,您可以使用 Windows 和 UNIX 标准库中的 shutil.disk_usage(“/”).free:)

18赞 Rob Truxal 2/1/2018 #11

如果您运行的是 python3:

与名称正则化一起使用可以工作:shutil.disk_usage()os.path.realpath('/')

from os import path
from shutil import disk_usage

print([i / 1000000 for i in disk_usage(path.realpath('/'))])

total_bytes, used_bytes, free_bytes = disk_usage(path.realpath('D:\\Users\\phannypack'))

print(total_bytes / 1000000) # for Mb
print(used_bytes / 1000000)
print(free_bytes / 1000000)

为您提供总空间、已用空间和可用空间(以 MB 为单位)。

评论

0赞 pstatix 5/6/2021
不知道这怎么不是选定的答案。不需要使用,这可能很麻烦,浏览 MSDN 文档并确保正确强制类型。ctypes
0赞 phoibos 8/31/2021
恕我直言,这是这个时代最好的方式。
0赞 grepit 7/26/2022 #12

以前的大多数答案都是正确的,我使用的是 Python 3.10 和 shutil。 我的用例是 Windows 和 C 驱动器(但您也应该能够为 Linux 和 Mac 扩展它(这是文档)

下面是 Windows 的示例:

import shutil

total, used, free = shutil.disk_usage("C:/")

print("Total: %d GiB" % (total // (2**30)))
print("Used: %d GiB" % (used // (2**30)))
print("Free: %d GiB" % (free // (2**30)))