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


Answers:


74
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
.f_bfree是文件系统中可用块的总数。应该乘以.f_bsize得到字节数。
jfs

8
至少在OS X Lion中/ Python的2.7我注意到,乘以.f_bsize给人以过于大的值f_bsize首选块大小,同时.f_frsize基本的块大小,并给出了正确的值。在我的linux测试系统上,两个值相同,因此.f_frsize应该一直工作。
2011年

1
用于在Android Phone上获取可用磁盘,并通过USB将其插入Windows系统,并在Windows上运行脚本。大。
heltonbiker

@JFSebastian这取决于您想要什么。Linux有可能为root保留空间。如果要包含此空间,请使用f_bfree。如果要获取用户可用的块数,请使用f_bavail。也许有人可以说是否以及如何对待配额?
数据

我有三个niggles上述:1 /文档字符串都错了,它以MB&2返回空间/我从来不喜欢看到不止一个return语句,(太多的时间作为测试我猜的),所以将结果存储在一个返回值3 /整个MB或十进制MB对某些人来说可能有所不同。
史蒂夫·巴恩斯

28

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

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

2
为什么这不是最佳答案?
jayatubi

2
我认为是因为psutil并不总是可以通过pypi获得。
jhasse

我同意这是一个很好的答案。我将过时的链接固定为psutil。由于disk_usage.free通常会返回一个巨大的64b整数,因此我建议您也想向人们展示disk_usage.percentpsutil.disk_usage(".").percent < 99.9对我来说似乎更清晰...
smci

24

您可以将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)

1
我不敢相信我必须走多远才能找到有人提到WMI。所有这些疯狂的人在可以使用WMI时直接使用ctypes直接调用Windows C API?
Craig Ringer

@CraigRinger是的,您是对的。我们应该使用正确的工具来做正确的事情。Windows的大多数常见管理任务已经用wmi中的win api包装了。我们不必重新制造轮子。:^ D
Erxin

为什么不psutil处理呢?
Fr0zenFyr 2015年

1
这就是为什么我喜欢stackoverflow。我什至不知道WMI模块,它可以完美地工作。
DanGoodrick

@ Fr0zenFyr是的,这是处理此任务的另一个好选择。
Erxin

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为单位)。


8

如果您不想添加其他依赖项,则可以为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'

5

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


这将是最好的答案,但是不幸的是psutil无法通过pip安装。
Gringo Suave

1
psutil现在可以从pypi和大多数其他来源(包括debian软件包)中获得。
2015年


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
我不明白为什么人们会投票反对。例如,此答案可能对某人有用。无论如何,它是其他pupe-Pythonic解决方案的很好的补充。如果有人不喜欢这个答案,那就没有理由投票否决了。据我了解,反对票是完全错误的答案。这不是。
ovgolovin

@ovgolovin投票给这个答案,很高兴知道另一种做同样事情的方法。
Erxin

1

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

import win32file    

def get_free_space(dirname):
    secsPerClus, bytesPerSec, nFreeClus, totClus = win32file.GetDiskFreeSpace(dirname)
    return secsPerClus * bytesPerSec * nFreeClus

1

os.statvfs()函数是一个更好的方式来得到这样的Unix平台(包括OS X)该信息。Python文档说“ Availability:Unix”,但是在您构建的Python版本中,值得检查它是否也可以在Windows上运行(即,文档可能不是最新的)。

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


3
os.statvfs()在Windows(Python 2.5.2-当前生产版本)上不起作用。
jfs

0

我不知道有任何跨平台的方法来实现这一目标,但是对您来说,一个不错的解决方法是编写一个包装类,该类检查操作系统并为每个操作系统使用最佳方法。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.