Pythonでなんちゃってディスク空き容量取得

サイズの大きいファイルを書き出すスクリプトなど、実行中の環境でディスクの空き容量を取得したいときがあります。ここではPythonで、標準モジュールを使って空き容量を取得する方法を試してみたいと思います。

今回のサンプルを記載しておきます。一応Windows, Linux両方、かつPython2, Python3で動く、ようにしたつもりですが全てのパターンの検証はしていません。

実装はavailable_capacity_mb関数で、引数は調べたいパス(ディレクトリへのパス)です。
デフォルトはos.getcwd()で実行中のディレクトリを渡しています。

Python3での空き容量取得

Python3.3からはshutil.disk_usage()が実装されているので、素直にこれを使います。

さて、その他のバージョンでは代替手段を考える必要があります。

Windowsでの空き容量取得

標準モジュールで、と言いつつあまりよろしくない方法で実装しています。

要はsubprocessでWindowsのfsutilコマンドを呼び出し、返ってきた標準出力をパースする、という動きにしています。

fsutil…コマンド出力の一行目が「空きバイト総数」。なので、出力をShift-JISでデコードし、改行文字で分割して一行目を取り出し、さらに分割してその行の最後の数字を取り出す、というかなり環境依存のやり方です。

Linuxでの空き容量取得

Linuxではos.statvfs()が使えるので、上のWindowsでの例よりはマシな実装です。

MB(メガバイト)での出力を得るために除算しています。
Windowsと違って権限の制御は厳密なので、アクセスが許可されていないパスを指定するとエラーを吐きます。

テスト

実行結果はこんな感じ。Windows環境(Windows 10 Pro + Python 3.6)で実行した例です。

ちなみに実在しないパスを指定するとエラーになります。

上の例では、fsutilコマンドの終了ステータスコードが失敗(non-zero)であることをメッセージで示しています。