在 OS/X 上的 python 中查找可用磁盘空间

问题描述 投票:0回答:8

我正在查找 HD 上的可用字节数,但在 python 上执行此操作时遇到困难。

我尝试过以下方法:

import os

stat = os.statvfs(path)
print stat.f_bsize * stat.f_bavail

但是,在 OS/X 上,它给了我 17529020874752 字节,大约是 1.6 TB,这会非常好,但不幸的是不是真的。

达到这个数字的最佳方法是什么?

python diskspace
8个回答
39
投票

尝试使用

f_frsize
代替
f_bsize

>>> s = os.statvfs('/')
>>> (s.f_bavail * s.f_frsize) / 1024
23836592L
>>> os.system('df -k /')
Filesystem   1024-blocks     Used Available Capacity  Mounted on
/dev/disk0s2   116884912 92792320  23836592    80%    /

19
投票

在 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)

用途:

>>> disk_usage('/')
usage(total=21378641920, used=7650934784, free=12641718272)
>>>

对于 Windows,您可以使用 psutil


16
投票

在 python 3.3 及更高版本中,shutil 为您提供相同的功能

>>> import shutil
>>> shutil.disk_usage("/")
usage(total=488008343552, used=202575314944, free=260620050432)
>>> 

4
投票

Psutil 模块 也可以用。

>>> psutil.disk_usage('/')
usage(total=21378641920, used=4809781248, free=15482871808, percent=22.5)

可以在此处找到文档。


0
投票
def FreeSpace(drive):
    """ Return the FreeSape of a shared drive in bytes"""
    try:
        fso = com.Dispatch("Scripting.FileSystemObject")
        drv = fso.GetDrive(drive)
        return drv.FreeSpace
    except:
        return 0

0
投票

令人惊讶的是,到了 2024 年,随着 TB 级别的磁盘越来越大,这仍然是一个问题。使用 Python 库(例如 Shutil、psutil 等)的解决方案似乎都无法正常工作,至少在 Mac OS 上是这样。另外

df -h
没有给我正确的值,所以我决定直接依赖
diskutil
并解析输出。这是完成这项工作的代码片段:

import re
import subprocess

volume = "/Volumes/data2"
cmd = ["diskutil", "info", volume]
result = subprocess.run(cmd, stdout=subprocess.PIPE)
r = result.stdout.decode('utf-8')

def to_tb(num_bytes):
    return num_bytes / 1e12

def extract_bytes(s):
    pattern = r'\((\d+) Bytes\)'
    byte_match = re.search(pattern, s)
    return int(byte_match.group(1)) if byte_match else None

data = {}
lines = r.split("\n")
for line in lines:
    if line:
        tokens = line.strip().split(":")
        if len(tokens) == 2:
            data[tokens[0].strip()] = tokens[1].strip()

total = extract_bytes(data['Container Total Space'])
used = extract_bytes(data['Volume Used Space'])
free = extract_bytes(data['Container Free Space'])

print(
    f"Volume: {volume}\n"
    f"  total: {to_tb(total):.4f}TB\n"
    f"  used: {to_tb(used):.2f}TB [{100*used/total:.2f}%]\n"
    f"  free: {to_tb(free):.2f}TB [{100*free/total:.2f}%]\n"
)

这是一个示例输出

Volume: /Volumes/data2
  total: 22.0008TB
  used: 1.27TB [5.76%]
  free: 20.73TB [94.23%]

这正是我在 macOS 磁盘工具中看到的。所有其他方法都给了我不准确或完全错误的值。

希望这有帮助。


-1
投票

它不是独立于操作系统的,但这适用于 Linux,也可能适用于 OS X:

打印命令.getoutput('df .').split(' ')[1].split()[3]

它是如何运作的?它获取“df”的输出。命令,它为您提供有关当前目录所属分区的磁盘信息,将其分成两行(就像打印到屏幕上一样),然后获取第二行(通过在首先 split()),然后将 that 行分割成不同的空格分隔的部分,最后,给出该列表中的第四个元素。

>>> commands.getoutput('df .')
'Filesystem           1K-blocks      Used Available Use% Mounted on\n/dev/sda3             80416836  61324872  15039168  81% /'

>>> commands.getoutput('df .').split('\n')
['Filesystem           1K-blocks      Used Available Use% Mounted on', '/dev/sda3             80416836  61324908  15039132  81% /']

>>> commands.getoutput('df .').split('\n')[1]
'/dev/sda3             80416836  61324908  15039132  81% /'

>>> commands.getoutput('df .').split('\n')[1].split()
['/dev/sda3', '80416836', '61324912', '15039128', '81%', '/']

>>> commands.getoutput('df .').split('\n')[1].split()[3]
'15039128'

>>> print commands.getoutput('df .').split('\n')[1].split()[3]
15039128

-5
投票

有什么问题

import subprocess
proc= subprocess.Popen( "df", stdout=subprocess.PIPE )
proc.stdout.read()
proc.wait()
© www.soinside.com 2019 - 2024. All rights reserved.