ミニプログラム

PC内の巨大ファイルを探すプログラム

PC内の巨大ファイル

コンソール上で実行するとローカルPC内の巨大ファイルを検索できるプログラムです。

コード例では、引数に検索したいディレクトリ(パス)を指定することで、指定したディレクトリ内に含まれる1000MB(=1GB)以上のファイルを探す仕様になっています。

ソースコード

from pathlib import Path
import sys

def search_files_by_size(path, min_size):
    if path.is_dir():
        for p in path.iterdir():
            search_files_by_size(p, min_size)
    elif path.is_file():
        size = path.stat().st_size
        if size >= min_size:
            size_mb = size / 1024 ** 2
            print("{:.1f}MB: {}".format(size_mb, path.resolve()))

def main():
    if len(sys.argv) == 1:
        path = Path()
    else:
        path = Path(sys.argv[1])
        if path.exists() == False:
            print("指定したファイルパスは存在しません")
            sys.exit()
    setsize_mb = 1000
    setsize_byte = setsize_mb * 1024 ** 2
    search_files_by_size(path, setsize_byte)

if __name__ == '__main__':
    main()

コードの解説

ライブラリのインポート

まず1~2行目でライブラリのインポートを実行します。

今回はファイル操作関連のpathlib、コマンドライン関連の操作を行うsysを使います。いずれも標準ライブラリなので、インストールの必要はありません。

ファイルの操作にはosという標準ライブラリもよく使われますが、今回はPython 3.4から導入されたpathlibを使っています。いずれのライブラリでも構いませんが、より新しいpathlibのほうが簡潔・スマートに書ける場合が多いです。

特定のサイズ以上のファイルを列記する関数を作成

4行目から12行目で特定のサイズ以上のファイルをサイズとともにコンソール上に出力する関数search_files_by_size()を作成しています。引数には、ファイルパスpathと設定サイズmin_sizeをとります。

まず、5行目でif~elif文により引数pathがフォルダか(is_dir)ファイルか(is_file)かで場合分けを行います。

フォルダの場合は、フォルダ内の各ファイル・フォルダについて、for p in path.iterdir()としてそれぞれを再び自身の関数search_files_by_size()に通します。

ファイルの場合は、.stat().st_sizeによりファイルのサイズを取得します。設定サイズ(今回は1000MB)以上の場合は、このとき取得できるサイズの単位がバイト(byte)なので、メガバイト表記に直すために1024x1024で割り算してメガバイト(MB)に直します。

print文でメガバイト単位のサイズとファイルパスを出力して完了です。

引数関連など

14行目以降はmain()関数として、先ほど作ったsearch_files_by_size()を実行するメインの部分のコードをまとめています。

まず引数をつけて実行されたかどうかをif~elif文により場合分けします。

len(sys.argv) == 1の場合、つまり引数が指定されていないときは、ファイルパスのオブジェクト作成時にPath()と引数をつけないことで検索対象にカレントディレクトリを指定します。

引数が指定されている場合は、まずそのファイルパスが存在するかどうかを判定します。存在しない場合はprint文によりメッセージ文を出力しプログラムを終了させ、存在する場合は、指定されたファイルパスを設定します。

22行目以降はサイズの設定です。

setsize_mbにメガバイト単位の設定値を代入し、次の行で単位をバイトに換算し、関数search_files_by_size()に渡して完成です。

タイトルとURLをコピーしました