ファイル・フォルダ操作 文法・環境

【python】ファイル・ディレクトリのサイズの取得方法

pythonで、ファイル・ディレクトリのサイズを取得する方法を紹介します。

pythonの標準モジュールである「osモジュール」を用いることでファイルやディレクトリのサイズを取得できます

この記事で分かること

■ファイルのサイズを取得

  • osモジュールのgetsizeメソッドで、ファイルサイズを取得

■ディレクトリのサイズを取得

  • osモジュールのscandirメソッドについて
  • ディレクトリのサイズを取得
  • 特定の拡張子のファイルのサイズの合計を取得

スポンサーリンク

ファイルのサイズを取得

ファイルのサイズは、osモジュールの "os.path.getsizeメソッド" で取得できます

なお、取得したサイズの単位は " バイト " になります。

以下、os.path.getsizeメソッドでファイルサイズを取得するサンプルコードです。
引数には、ファイルのパスを指定します。

### os.path.getsizeメソッドでファイルサイズを取得
import os

dir_path = r'C:\*--- 任意のパス ---* '
file_name = 'pic1.jpg'

file_path = os.path.join(dir_path, file_name)

file_size = os.path.getsize(file_path)
print(file_size)
# 180011

" *--- 任意のパス ---* "の箇所は、ご自身のファイルの保存先に置き換えてください。

スポンサーリンク

ディレクトリのサイズを取得

次に、ディレクトリのサイズを取得する方法を紹介します。

ディレクトリのサイズを取得する方法はいくつかありますが、scandirメソッドを用いてサイズを取得する例を紹介します。

はじめに、scandirメソッドの基本的な使い方について、簡単に紹介します。

osモジュールのscandirメソッドについて

osモジュールのscandirメソッドは、python3.5以降に追加されたメソッドです。

scandirメソッドを用いることで、ディレクトリ内の要素とその属性をまとめて取得することができます。

以下、osモジュールのscandirメソッドを用いて、ディレクトリ内の要素とその属性を取得するサンプルコードです。

### scandirメソッドを用いて、ディレクトリ内の要素とその属性を取得
import os
import pprint

dir_path = r'C:\ *--- 任意のパス ---* '

elem_list = [i for i in os.scandir(dir_path)]
pprint.pprint(elem_list)
"""
[<DirEntry 'diff.html'>,
 <DirEntry 'file1.txt'>,
 <DirEntry 'file2.txt'>,
 <DirEntry 'file3.txt'>,
 <DirEntry 'folder1'>,
 <DirEntry 'folder2'>,
 <DirEntry 'folder3'>,
 <DirEntry 'pic1.jpg'>,
 <DirEntry 'pic2.jpg'>,
 <DirEntry 'pic3.jpg'>]
"""

print(elem_list[1].name)
# file1.txt

print(elem_list[1].path)
# C:\ *--- 任意のパス ---* \file1.txt

print(elem_list[1].is_dir())
# False

print(elem_list[1].is_file())
# True

print(elem_list[1].stat().st_size)
# 49

リスト内包表記を用いて、DirEntryオブジェクトをリスト化しています。

ファイル名、ファイルパス、ディレクトリかファイルかの属性なども取得できます

また、 stat( ).st_size を指定することでファイルのサイズも取得できます

ディレクトリのサイズを取得【scandirメソッド】

osモジュールのscandirメソッドを用いて、ディレクトリのサイズを取得する方法を紹介します。

以下、ディレクトリサイズを取得するサンプルコードです。
こちらのサイトを参考にさせて頂いています。

再帰的にディレクトリのサイズを取得するために、関数化されています。

### ディレクトリのサイズを取得
def get_dir_size(path='.'):
    total_size = 0
    with os.scandir(path) as it:
        for entry in it:
            if entry.is_file():
                total_size += entry.stat().st_size
            elif entry.is_dir():
                total_size += get_dir_size(entry.path)
    return total_size


dir_path = r'C:\ *--- 任意のディレクトリのパス ---* '
print(get_dir_size(dir_path))
# 876321

> with os.scandir(path) as it :
> for entry in it:

os.scandirメソッドで取得した、DirEntryオブジェクトを、1つずつ取り出しています。

> if entry.is_file( ) :
> total_size += entry.stat().st_size

is_fileメソッドでファイルかどうかを判定し、ファイルの場合は、stat_resultオブジェクトのst_size属性でファイルサイズを取得します。

> elif entry.is_dir( ) :
> total_size += get_dir_size(entry.path)

is_dirメソッドでディレクトリかどうかを判定し、ディレクトリの場合は、関数を再帰的に呼び出し、すべてのファイルのサイズを加算した合計サイズを返しています。

なお、作成した関数 " get_dir_size " は、引数にファイルパスを指定するとエラーとなります。
ファイルのパス、ディレクトリのパス、どちらのパスを指定してもサイズを返すようにするには、下記のようにします。

### ファイルまたはディレクトリのサイズを取得
def get_dir_size(path='.'):
    total_size = 0
    with os.scandir(path) as it:
        for entry in it:
            if entry.is_file():
                total_size += entry.stat().st_size
            elif entry.is_dir():
                total_size += get_dir_size(entry.path)
    return total_size

def get_size(path='.'):
    if os.path.isfile(path):
        return os.path.getsize(path)
    elif os.path.isdir(path):
        return get_dir_size(path)


dir_path = r'C:\ *--- 任意のパス ---* '
print(get_size(dir_path))
# 876321

特定の拡張子のファイルのサイズの合計を取得

次に、特定の拡張子のファイルのみのサイズを合計し、取得する方法を紹介します。

前述の関数に、ファイルの拡張子を判定する条件式を追加しています。

### 特定の拡張子のファイルのサイズの合計を取得
def get_dir_size(ext, path='.'):
    total_size = 0
    with os.scandir(path) as it:
        for entry in it:
            if entry.is_file():
                if os.path.splitext(entry.path)[1] == ext :
                    total_size += entry.stat().st_size
                else :
                    pass
            elif entry.is_dir():
                total_size += get_dir_size(ext, entry.path)
    return total_size


dir_path = r'C:\ *--- 任意のディレクトリのパス ---* '
print(get_dir_size('.txt', dir_path))
# 433

> if os.path.splitext( entry.path )[1] == ext :

os.path.splitextで、ファイルパスから拡張子を取得しています。

拡張子が一致した場合のみ、ファイルサイズを合計しています。

スポンサーリンク

まとめ

pythonで、ファイル・ディレクトリのサイズを取得する方法を紹介しました。

osモジュールのscandirは使えると便利なので、是非覚えておいてください。

スポンサーリンク

-ファイル・フォルダ操作, 文法・環境
-,