この記事では、Python でファイルまたはフォルダーのサイズを確認する方法を学習します。
Python は最も多用途なプログラミング言語の 1 つです。これを使用すると、小さな CLI (コマンド ライン インターフェイス) プログラムから複雑な Web アプリケーションまでを構築できるようになります。
ただし、最も過小評価されている機能の 1 つは、運用システムと対話する機能です。 Python を使用して OS 操作を管理すると、自動化プロセスを作成する時間を大幅に節約できます。
Python が OS とどのように対話するかを見てみましょう。
Python は OS とどのように対話するのでしょうか?
誰も環境から孤立して生きることはできません。これは Python にも当てはまります。Python では、作業を完了するために運用システムと対話することが基本となる場合があります。
Python には、OS と対話できるようにするいくつかのモジュールがあります。最もよく使用されるのは、os、sys、pathlib、およびサブプロセスです。
これらは組み込みモジュールであるため、PIP を使用してインストールする必要はありません。次のステートメントを使用して、それらをすべてインポートできます。
import os
import sys
import pathlib
import subprocess
以下のリストは、これらの各インポートの主な機能を示しています。
- Os:システム固有の (OS に応じた) 機能を使用するポータブルな方法。より高度な機能が必要でない限り、ほとんどの場合、これが正しい選択です。
- Sys:システム固有のパラメータと関数。このモジュールは、インタープリター変数および関数へのアクセスを提供します。 os モジュールは運用システムと対話し、sys は Python インタープリターと対話します。
- Pathlib:高度なパスの使用法。各 OS に適切なセマンティクスを使用して、ファイル システムをオブジェクトとして表現できます。
- サブプロセス: Python から直接実行およびサブプロセス管理。これには、
stdin
、stdout
、および戻りコードの操作が含まれます。詳細については、Python サブプロセス ガイドを参照してください。
ニーズに応じて、さらに具体的な機能を含む高レベルのライブラリがあります。ただし、ほとんどの場合、上記のモジュールを使用しても問題ありません。
注:これらのモジュールによって提供される関数のほとんどは、OS に応じて異なる出力を持ちます。通常、最もよく一致するのはUNIXと Python であることに注意してください。
これで、Python が OS とどのように対話するかを簡単に理解できたので、ファイルとフォルダーのサイズを確認する方法に移りましょう。次のソリューションはすべて、 Python GitHub リポジトリのファイルとフォルダーのサイズで利用できます。
os.stat().st_size の使用
このメソッドでは、os モジュールのstat()関数を使用します。特定のパスに関する多くの情報を返します。
注: os.path.getsize()関数もジョブを完了します。 os.stat() を使用する利点。 st_sizeは、simlink に従いません。
続行する前に、 lorem.txtという名前のテスト ファイルを作成しましょう。このファイルにダム テキストを貼り付けます。 Lorem Ipsum テキスト ジェネレーターにアクセスし、テキストをlorem.txtファイルに貼り付けることができます。
同じディレクトリに、 method1.pyという名前のファイルを作成し、以下のコードを貼り付けます。
import os
size = os.stat('lorem.txt').st_size
print(size)
このコードで何を行っているかを詳しく見てみましょう。
- 最初の行では、 osモジュールをインポートしています
- サイズ変数には、ファイルlorem.txtのサイズが含まれます。
- os.stat()関数は、ファイルに関連する一連の情報を返します。
- st_size属性はファイルのサイズを表します
- サイズ変数を出力します
Python スクリプトを実行してみます。 lorem.txtファイルの内容に応じて、異なる結果が得られます。
出力:
20064
出力はバイト単位で表されます。これはまったく判読できないため、ファイルのサイズをより正確に把握できるように人間味を持たせてみましょう。
まず、シェルで次のコマンドを実行して、 humanizeパッケージをインストールします。
pip install humanize
次に、 naturalsize()関数を使用して、バイト単位の値を読み取り可能なファイル サイズ (KB、MB、GB、TB など) に変換します。
import os
from humanize import naturalsize
size = os.stat('lorem.txt').st_size
print(size)
print(naturalsize(size))
最初に、上記のコードはファイルのサイズをバイト単位で出力し、次に結果を読み取り可能なサイズで出力します。
出力:
20064
20.1 kB
パスリブの使用
pathlib はパスのみを操作するように設計されていますが、他のモジュールのいくつかの便利な関数が Path オブジェクト (Path クラスのインスタンス) のメソッドとして組み込まれています。
ファイルmethod2.pyを作成し、 Pathクラスをインポートします。
from pathlib import Path
次に、 lorem.txtファイルへのパスを引数として渡す Path オブジェクトを作成します。
file_ = Path('lorem.txt')
これで、Path クラスのstat()メソッドにアクセスできるようになりました。これはos.stat()関数と同じように動作するため、ファイルのサイズを出力できます。
print(file_.stat().st_size)
出力:
20064
ご覧のとおり、最初に使用した方法と同じ結果が得られました。上記の結果もバイト形式で出力されるため、humanize モジュールを使用して読み取れるようにすることができます。
from pathlib import Path
from humanize import naturalsize
size = Path('lorem.txt').stat().st_size
print(naturalsize(size))
このコードは次の出力を生成します。
20.1 kB
サブプロセスで Unix コマンドを使用する:
subprocess モジュールを使用すると、Python からサブプロセスを呼び出して管理できるようになります。したがって、任意のコマンドを実行し、その出力を Python で直接処理できます。
注:この方法は、Unix OS (Linux、Mac) を実行している場合にのみ機能します。
ファイルmethod3.pyを開き、以下のコードを貼り付けます。
from subprocess import run
process = run(['du', 'lorem.txt'], capture_output=True, text=True)
print(process.stdout)
このコード部分を詳しく見てみると、次のようになります。
- サブプロセスモジュールからrun 関数をインポートします。
- 変数 process には、コマンドdu lorem.txtの実行結果が含まれます。
- duは、ファイルのディスク領域を取得できる Linux ユーティリティです。
- Capture_output を使用すると、standout (標準出力) 属性にアクセスできます。
- text は、出力をバイトではなく文字列として保存することを意味します
- プロセスの標準出力を出力します。
上記のコードを実行すると、次の出力が得られます。
20 lorem.txt
ご覧のとおり、ファイルのサイズと名前が表示されます。ファイルのサイズのみを取得したい場合は、出力を分割し (文字列であることを忘れないでください)、最初の要素を出力する必要があります。
from subprocess import run
process = run(['du', 'lorem.txt'], capture_output=True, text=True)
size = process.stdout.split()[0]
print(size)
出力:
20
この出力はまったく読めません。使用されている測定単位は KB であると推測できます (前の方法のため) が、ファイルのサイズを推測できる人は他にいませんでした。
この問題を解決するには、 -h (人間が読める) フラグを使用します。
注: man duまたはdu –helpを実行すると、このコマンドのマニュアルを入手できます。
from subprocess import run
process = run(['du', '-h', 'lorem.txt'], capture_output=True, text=True)
size = process.stdout.split()[0]
print(size)
これで、このスクリプトの出力がはるかに読みやすくなります。
20K
サブプロセス モジュールと可能なアプリケーションについて詳しく知りたい場合は、Python サブプロセス ガイドを参照してください。
フォルダーのサイズを再帰的に取得する
フォルダーのサイズを取得したい場合は、ディレクトリとそのサブディレクトリに存在する各ファイルを反復処理する必要があります。次の 2 つの方法でそれを行います。
- pathlib を使用してパスを反復する
- サブプロセスでの du コマンドの使用
次のコードは、ホーム フォルダー内のテスト ディレクトリへのパスを使用します。サイズを取得したいディレクトリのファイルのパスを置き換える必要があります。
pathlib を使用してパスを反復する
ファイルのサイズを反復処理してディレクトリのサイズを取得する方法を見てみましょう。
from pathlib import Path
from humanize import naturalsize
def get_size(path = '.'):
size = 0
for file_ in Path(path).rglob('*'):
size += file_.stat().st_size
return naturalsize(size)
test_path = Path.home() / 'Documents/tests/'
print(get_size(test_path))
このコードは少し怖いように思えます。各部分が何をしているのかを詳しく見てみましょう。
- Pathクラスとnaturalsize()関数をインポートします。
- get_size()関数をパラメーターpathで定義します。このパラメーターはデフォルトで現在のディレクトリを指します。
- サイズ変数は、各ファイルのサイズを追加する単なるプレースホルダーです。
- パスの各ファイルを反復処理します。
- rglob()メソッドは、パターンに一致するファイルを再帰的に返します。
- rglob(‘*’) は、ディレクトリ内のすべてのファイルを取得していることを意味します
- 各ファイルのサイズを取得し、サイズ変数に追加します。
- 人間が判読できる方法でサイズ変数を返します。
もちろん、私のマシンでのみ利用可能なディレクトリを使用して機能をテストしています。コンピューター上に存在するフォルダーへのパスを変更することを忘れないでください。
私の場合、次の出力が得られます。
403.4 MB
サブプロセスでの du コマンドの使用
このアプローチにはいくつかの利点があります。
- 結果はもう少し正確です
- はるかに高速です
from subprocess import run
from pathlib import Path
test_path = Path.home() / 'Documents/tests/'
process = run(['du', '-sh', test_path], capture_output=True, text=True)
size = process.stdout.split()[0]
print(size)
方法 3 と同じアプローチを使用していますが、今回はファイルの代わりにディレクトリのサイズを取得します。
出力:
481M
フォルダーのサイズを取得するこれら 2 つの方法からわかるように、 はわずかに異なる結果を返します。ディレクトリが大きくなればなるほど、その差は大きくなります。
pathlib アプローチとサブプロセスアプローチのどちらを選択するかはあなた次第です。 subprocess を使用するたびに Linux を使用することがわかっている場合は、 pathlib ソリューションを使用できます。
総括する
Python は、OS と対話するときに非常に便利です。 Python を使用するとプロセスを自動化し、時間を大幅に節約できます。 OS と対話する主なモジュールは、os、sys、path、および subprocess です。
このチュートリアルでは次のことを学びました。
- Python が OS と対話する方法
- OS操作を行うための組み込みモジュールの使用
- humanizeモジュールを使用して人間が読める形式で印刷する方法
- 3 つの方法でファイルのサイズを計算するには
- ディレクトリのサイズを再帰的に計算するか、 duコマンドを使用して計算するには