Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでファイルを検索する方法|os.walkによるディレクトリ走査の基本

Pythonで特定のディレクトリの中から目的のファイルを探したい場合、標準ライブラリの os.walk を使ってディレクトリツリーを再帰的に走査するのが定番の方法です。サブフォルダも含めてすべてのファイルを自動的にチェックできるため、階層が深いフォルダ構成でも柔軟に対応できます。

os.walkを使ったファイル検索の実装例

import os

def find_file(file_name, directory_name):
    files_found = []
    for path, subdirs, files in os.walk(directory_name):
        for name in files:
            if file_name == name:
                file_path = os.path.join(path, name)
                files_found.append(file_path)
    return files_found

find_file('my_file.txt', 'my_folder')

このスクリプトでは、os.walk(directory_name) が指定したフォルダ以下を順番にたどり、各階層ごとに「現在のパス・サブディレクトリ一覧・ファイル名一覧」を返します。ファイル名が一致したものだけを os.path.join でフルパスに組み立て、リストに追加していく仕組みです。

検索対象のフォルダ構成例

このスクリプトを実行したとき、フォルダ構成が次のようになっているとします。

my_folder/
    another_folder/
        my_file
        another_file
    hello.py
    my_file

実行結果

上記の状態でスクリプトを実行すると、名前が一致したファイルのパスがリスト形式で出力されます。

['/my_folder/another_folder/my_file', '/my_folder/my_file']

このように、サブフォルダ内のファイルも含めて、条件に合致するすべてのファイルパスを一度に取得できるのが os.walk の強みです。

pathlibを使った別の書き方

Python 3.4以降では、より直感的に書ける pathlib.Path.rglob() を使う方法もあります。

from pathlib import Path

def find_file(file_name, directory_name):
    return [str(p) for p in Path(directory_name).rglob(file_name)]

rglob は再帰的にパターンマッチを行うメソッドなので、わずか数行で同じ処理を実現できます。コードの可読性を重視する場合はこちらを選ぶのも良いでしょう。

  1. Pythonのscikit-learnを使って画像の輪郭を検出する方法

    scikit-learn(通称:sklearn)は、機械学習アルゴリズムを実装するために使用されるPythonのライブラリです。オープンソースとして公開されているため、無料で利用できます。このライブラリは、NumPy・SciPy・Matplotlibという3つのライブラリを基盤として構築されています。画像から輪郭を抽出する際には、「マーチングスクエア法(marching squares)」と呼ばれる手法が用いられます。具体的には、skimageライブラリのmeasureモジュールに含まれる「find_contours」関数を使用します。この関数では、配列内の値が線形補間されるため、出力画像にお

  2. Pythonでファイルを削除する方法をわかりやすく解説

    Pythonでファイルを削除する基本の方法 Pythonでは、標準ライブラリのosモジュールを使うことで、単一のファイルや空のフォルダ(ディレクトリ)を簡単に削除できます。外部ライブラリのインストールは不要で、import osと記述するだけですぐに利用できるのが魅力です。 os.remove() でファイルを削除する たとえば、カレントディレクトリにある my_file.txt というファイルを削除したい場合は、次のように記述します。 >>> import os >>> os.remove(my_file.txt) os.remove() の引数には、削