76

Linux、Windows、および OS X で python を使用して、ディスク ボリュームに残っているスペースを特定する方法が必要です。現在、これを達成するために、さまざまなシステム コール (df、dir) の出力を解析しています。より良い方法はありますか?

4

11 に答える 11

78
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

于 2010-03-03T14:45:23.103 に答える
31

を使用してpsutilをインストールしpip install psutilます。次に、次を使用して空き容量をバイト単位で取得できます。

import psutil
print(psutil.disk_usage(".").free)
于 2015-04-29T12:43:17.000 に答える
27

Windows にはwmiモジュールを、UNIX には os.statvfsを使用できます。

窓用

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)
于 2013-10-12T09:20:42.553 に答える
10

別の依存関係を追加したくない場合は、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'
于 2009-11-13T09:22:14.867 に答える
6

Python 3.3 からは、Windows と UNIX の両方の標準ライブラリからshutil.disk_usage("/").freeを使用できます:)

于 2016-08-11T07:11:52.253 に答える
5

クロスプラットフォームの良い方法は、psutil を使用することです: http://pythonhosted.org/psutil/#disks (psutil 0.3.0 以上が必要であることに注意してください)。

于 2011-07-21T09:02:48.297 に答える
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
于 2008-09-09T23:48:07.137 に答える
1

os.statvfs()関数は、Unix ライクなプラットフォーム (OS X を含む) の情報を取得するためのより良い方法です。Python のドキュメントには「可用性: Unix」と記載されていますが、Python のビルドで Windows でも動作するかどうかを確認する価値があります (つまり、ドキュメントが最新ではない可能性があります)。

それ以外の場合は、pywin32ライブラリを使用してGetDiskFreeSpaceEx関数を直接呼び出すことができます。

于 2008-09-09T11:40:26.697 に答える
1

以下のコードは、Windows で正しい値を返します

import win32file    

def get_free_space(dirname):
    secsPerClus, bytesPerSec, nFreeClus, totClus = win32file.GetDiskFreeSpace(dirname)
    return secsPerClus * bytesPerSec * nFreeClus
于 2016-03-08T06:53:17.783 に答える
0

これを達成するためのクロスプラットフォームの方法はわかりませんが、オペレーティング システムをチェックし、それぞれに最適な方法を使用するラッパー クラスを作成することをお勧めします。

Windows の場合、win32 拡張機能にGetDiskFreeSpaceExメソッドがあります。

于 2008-09-09T11:47:20.380 に答える