Pythonのスクリプト中で、ディレクトリ(フォルダ)が空かどうか確認してから処理を行いたいことがたまにあります。そこで、簡単に調べたところosモジュールのlistdir関数を使う方法と、globモジュールのglob関数を利用する方法があるようでした。
os.listdirを使う方法
listdir関数を使うと、与えられたディレクトリ下に存在するファイルとディレクトリ名の一覧をリスト形式で取得できます。
>>> import os >>> os.listdir(".") ['test3.txt', 'test1.txt', 'test2.txt', '.hidden']
ディレクトリが空なら戻り値のリストも空になるため、ディレクトリが空かどうかの判定に使えます。ファイル名がピリオドで始まる隠しファイルも含めて取得できるので厳密にディレクトリが空かどうか判定したいときには便利です。
glob.globを使う方法
glob関数は指定されたパス名を表す文字列にマッチするファイルパスのリストを返します。ワイルドカードを使用することで特定のディレクトリ下に存在する全てのファイルやディレクトリ名を取得できます。
>>> import glob >>> glob.glob("./*") ['./test3.txt', './test1.txt', './test2.txt']
上の例では隠しファイルがマッチしませんので、隠しファイルは無視したいという場合には便利です。
ディレクトリが空かどうか判定するスクリプト(隠しファイルは除く)
個人的にはディレクトリのパスを与えるだけで良いlistdir関数の方を利用したかったのですが、隠しファイルについては除きたかったのでリスト内包表記を利用して除外することにしました。startswithメソッドを使ってファイル名の先頭がピリオドでないものだけを取得しています。
隠しファイルを除く
>>> files ['.hidden1', 'test3.txt', '.hidden2', 'test1.txt', 'test2.txt'] >>> files = [f for f in files if not f.startswith(".")] >>> files ['test3.txt', 'test1.txt', 'test2.txt']
以上をまとめて完成したスクリプトを下に載せました。
スクリプト
#!/usr/bin/env python3 import sys import os def is_empty(directory): files = os.listdir(directory) files = [f for f in files if not f.startswith(".")] if not files: return True else: return False if __name__ == '__main__': src = sys.argv[1] empty = is_empty(src) print(empty)
少しでも参考になれば幸いです。最後までお読みいただきありがとうございました。