Pythonでファイルを検索する方法(os.walkの使い方)
はじめに
Pythonでは、OS上の指定したパスの中からファイル名を検索することができます。これを実現するのが、標準ライブラリのosモジュールに含まれるwalk()関数です。os.walk()は特定のパスを入力として受け取り、dirpath(ディレクトリのパス)、dirnames(サブディレクトリ名のリスト)、filenames(ファイル名のリスト)の3要素からなるタプルを生成します。
この関数は指定されたディレクトリを起点として、その配下にあるすべてのサブディレクトリを再帰的(トップダウン方式)に走査するため、階層構造の深い場所にあるファイルも漏れなく見つけ出すことができます。
コード例
以下の例では、ルートディレクトリ「D:\」を起点として、「smpl.htm」という名前のファイルを検索しています。プログラムはWindows OS上で実行しています。
import os
def find_files(filename, search_path):
result = []
# ルートからトップダウン方式で走査
for root, dir, files in os.walk(search_path):
if filename in files:
result.append(os.path.join(root, filename))
return result
print(find_files("smpl.htm", "D:"))実行結果
上記のコードを実行すると、次のような結果が出力されます。
['D:TP\\smpl.htm', 'D:TP\\spyder_pythons\\smpl.htm']
この結果から、対象のファイルがメインディレクトリとそのサブディレクトリの両方に存在していることが確認できます。os.path.join()を使うことで、OSに依存しない正しいパス区切り文字でフルパスを組み立てられる点もポイントです。
補足:os.walk()の便利な使い方
os.walk()にはいくつか便利なオプションがあります。
- topdown引数:デフォルトは
True(トップダウン)ですが、Falseを指定するとボトムアップ方式で走査できます。 - onerror引数:アクセス権限がないディレクトリなどでエラーが発生した場合のコールバック関数を指定できます。
- 大規模な検索の高速化:特定の拡張子だけを探したい場合は、
filesリストに対して条件分岐を追加すると効率的です。
また、よりシンプルなパターンマッチングにはglobモジュール、オブジェクト指向的なパス操作にはpathlibモジュール(Path.rglob())も選択肢となります。用途に応じて使い分けるとよいでしょう。
-
Pythonで作るWebサイトブロッカー ― 業務時間中にSNSへのアクセスを自動遮断する方法
大手IT企業で働いたことがある方なら、FacebookやYouTube、InstagramといったSNS系のWebサイトが社内からアクセスできないよう制限されていることに気づいた経験があるかもしれません。こうした制限は、サードパーティ製アプリに頼らなくても実現できます。自分専用のオリジナルツールを作れば、好きなWebサイトを自由にブロックできるのです。しかもPythonでWebサイトブロッカーを開発するのは、それほど難しいことではありません。この記事では、指定したWebサイトをブロックするPythonスクリプトの作り方を解説します。前提条件Python 3.x がインストールされていることPy
-
PythonでのCX_Freezeの使い方:スクリプトを実行ファイル(EXE)に変換する方法
はじめに 何か面白いものを作りたいという欲求は人間の本能であり、完成したものは誰かに共有したくなるものです。Pythonでもその願いを叶えられます。ただし、作成したPythonスクリプトをそのまま共有するには、相手のマシンにも同じバージョンのPythonと、プログラムで使用しているすべてのモジュールがインストールされている必要があります。 そこで役立つのがCX_Freezeです。このツールを使えば、Pythonがインストールされていない環境でも動作するスタンドアロンの実行ファイル(.exe)を作成できます。 CX_Freezeのインストール まず、コマンドプロンプトで以下のコマンドを実行し、c