Pythonでファイルとフォルダのサイズを確認する方法は?

公開: 2021-06-16

この記事では、Pythonでファイルまたはフォルダーのサイズ確認する方法を学びます。

Pythonは、最も用途の広いプログラミング言語の1つです。 これを使用すると、小さなCLI(コマンドラインインターフェイス)プログラムから複雑なWebアプリケーションを構築できます。

ただし、その最も過小評価されている機能の1つは、オペレーティングシステムと対話する機能です。 PythonでOSの操作を管理すると、自動化プロセスを作成するときに時間を大幅に節約できます。

PythonがOSとどのように相互作用するかを見てみましょう。

PythonはOSとどのように相互作用しますか?

Pythonは、OS、sys、パス、およびサブプロセスモジュールを使用してOSと対話します

誰も彼らの環境から孤立して生きることはできません。 これはPythonにも当てはまります。Pythonでは、オペレーティングシステムと対話して作業を行うことが基本的な場合があります。

Pythonには、OSと対話するためのモジュールがいくつかあります。 最もよく使用されるのは、os、sys、pathlib、およびsubprocessです。

これらは組み込みモジュールであるため、PIPを使用してインストールする必要はありません。 次のステートメントを使用して、それらすべてをインポートできます。

 import os import sys import pathlib import subprocess

以下のリストは、これらのインポートのそれぞれの主な機能を示しています。

  • Os:システム固有の(OSに応じて)機能を使用するポータブルな方法。 より高度なものが必要でない限り、ほとんどの場合、これは正しい選択です。
  • システムシステム固有のパラメーターと機能。 このモジュールは、インタープリター変数と関数へのアクセスを提供します。 osモジュールはオペレーティングシステムと相互作用し、sysはPythonインタープリターと相互作用します
  • Pathlib:高度なパスの使用法。 各OSに適切なセマンティクスを使用して、ファイルシステムをオブジェクトとして表すことができます。
  • サブプロセス: Pythonから直接実行およびサブプロセス管理。 これには、 stdinstdout 、および戻りコードの操作が含まれます。 Pythonサブプロセスガイドを読むことで、それについてさらに学ぶことができます。

ニーズに応じて、さらに具体的な機能を含む高レベルのライブラリがあります。 ただし、ほとんどの場合、上記のモジュールを使用するのが適切です。

注:これらのモジュールによって提供される機能のほとんどは、OSに応じて異なる出力を持ちます。 通常、最適なのはUNIXとPythonであることを忘れないでください。

これで、PythonがOSとどのように相互作用するかを簡単に把握できたので、ファイルとフォルダーのサイズを確認する方法に飛び込みましょう。 次のすべてのソリューションは、PythonGitHubリポジトリのファイルとフォルダーのサイズで利用できます

os.stat()。st_sizeを使用する

このメソッドでは、osモジュールのstat()関数を使用します。 特定のパスに関する多くの情報を返します。

注: os.path.getsize()関数もジョブを実行します。 os.stat()を使用する利点 st_sizeは、 simlinksをたどらないということです。

続行する前に、 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

次に、バイト単位の値を読み取り可能なファイルサイズ(KB、MB、GB、TBなど)に変換するnaturalsize()関数を使用できます。

 import os from humanize import naturalsize size = os.stat('lorem.txt').st_size print(size) print(naturalsize(size))

最初に、上記のコードはファイルのサイズをバイト単位で出力し、次に結果を読み取り可能なサイズで出力します。

出力:

 20064 20.1 kB

Pathlibの使用

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コマンドの使用:

サブプロセスモジュールを使用すると、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関数をインポートします
  • 可変プロセスには、コマンドdulorem.txtを実行した結果が含まれています
    • duは、ファイルのディスク容量を取得できるLinuxユーティリティです。
    • Capture_outputは、傑出した(標準出力)属性へのアクセスを提供します
    • テキストは、出力をバイトではなく文字列として保存していることを意味します
  • プロセスの標準出力を印刷します

上記のコードを実行すると、次の出力が得られます。

 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 (人間が読める形式)フラグを使用できます。

注:デュ男、またはデュ-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()関数を定義します。
  • サイズ変数は、各ファイルのサイズを追加する単なるプレースホルダーです。
  • パスの各ファイルを反復処理します
    • 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またはサブプロセスアプローチのどちらかを選択するのはあなた次第です。 サブプロセスを使用するたびにLinuxを使用することがわかっている場合は、pathlibソリューションを使用できます。

総括する

Pythonは、OSと対話するときに非常に便利です。 Pythonを使用すると、プロセスを自動化し、時間を大幅に節約できます。 osと対話するための主なモジュールは、os、sys、path、およびサブプロセスです。

このチュートリアルでは、次のことを学びました。

  • PythonがOSとどのように相互作用するか
  • OS操作を行うための組み込みモジュールの使用
  • 人間が読める形式で印刷するためにhumanizeモジュールを使用する方法
  • 3つのアプローチでファイルのサイズを計算するには
  • ディレクトリのサイズを再帰的に、またはduコマンドを使用して計算するには