ディレクトリ内の探索#
指定されたディレクトリ内のファイル数、ディレクトリ数を数えるには、ディレクトリの一覧を取得し、その中でディレクトリ数、ファイル数を数える必要があります。 また、取得した一覧の中のディレクトリに対して、同様にディレクトリ内のファイル数、ディレクトリ数を数える必要があります。 このような処理は再帰呼び出しを用いて実装できます。
os.listdir#
ディレクトリの一覧を取得するには、os.listdir 関数を用います。
取得したパスがディレクトリであるかを判定するには、os.path.isdir() 関数を用います。
同様に、ファイルであるかを判定するには、os.path.isfile() 関数を用います。
これらの関数を用いるには、os モジュールをインポートする必要があります。
なお、以下のプログラムの実行結果は、次の dirs.zip をダウンロード、展開してできたディレクトリ構造(root)を想定しています。
また、以下の実行例のリストの順序は必ずしもこの通りではありません。
>>> import os
>>> dirs = os.listdir('root')
>>> dirs
['dir2', 'dir5', 'dir4', 'dir3', 'dir1']
>>> >>> os.listdir("root" + dirs[0]) # listdir はパスを意識しているわけではない。
Traceback (most recent call last): # 指定されて初めて、そのパスの存在確認を行う。
File "<stdin>", line 1, in <module> # そのため、/ のあるなしで挙動が変わる。
FileNotFoundError: [Errno 2] No such file or directory: 'rootdir2' # root/dir2 ではなく、rootdir2 であるため、エラーが発生する。
>>> os.listdir("root/" + dirs[0]) # しっかりと相対パスを指定すると、正しく動作する。
['file3', 'file2', 'file1']
>>> path = os.path.join("root", dirs[0]) # os.path.join を用いると、最後のスラッシュの有無を気にしなくて良い。
>>> path
root/dir2
>>> os.listdir(path)
['file3', 'file2', 'file1']例題 指定されたディレクトリ以下のファイル数、ディレクトリ数#
指定されたディレクトリ以下のファイル数、ディレクトリ数を数えるプログラム count_dirs.py を作成してください。
count_dirs という関数を用意し、与えられたパス内のファイル数、ディレクトリ数をタプルで返すようにしてください。
この関数で与えられたパスのファイル、ディレクトリ一覧を取得し、その一覧の中のディレクトリに対して、
再度 count_dirs を呼び出してください。
呼び出した結果として、得られるファイル数、ディレクトリ数を加算して返すことで、トータルのファイル数、ディレクトリ数を求められます。
import os
import sys
def count_dirs(path):
files = 0
if os.path.isdir(path): # pathがディレクトリの場合は、ディレクトリ数を1にする。
dirs = 1
else: # そうでない場合、ディレクトリ数の初期値は 0 にする。
dirs = 0
for item in os.listdir(path):
if os.path.isdir(os.path.join(path, item)): # ディレクトリの場合は
f, d = count_dirs(os.path.join(path, item)) # path + item を起点に再度 count_dirs を呼び出す
dirs = dirs + d # ディレクトリ数を加算する。
files = files + f # ファイル数も加算する。
elif os.path.isfile(os.path.join(path, item)): # ファイルの場合は
files += 1 # ファイル数をインクリメントする。
return (files, dirs) # ファイル数、ディレクトリ数を返す
for i in sys.argv[1:]:
f, d = count_dirs(i)
print(f"{i}: {f} files, {d} directories")このプログラを実行すると、指定されたディレクトリ以下のファイル数、ディレクトリ数が表示されます。
$ python count_dirs.py root
root: 27 files, 9 directories
$ find root -type f | wc -l # root 以下のファイル数を確認する。
27
$ find root -type d | wc -l # root 以下のディレクトリ数を確認する。
9