【Python】任意のフォルダ内のテキストファイル内の文字列を一括検索するスクリプト

本ブログはアフィリエイト広告を利用しています

WEB / アプリ
WEB / アプリ
この記事は約6分で読めます。

とっちゃん@nyanco! です。

今回は指定フォルダ内にあるテキストファイル(txt、tsv、csv、html、php、pyなど)内の文字列を一括検索するPythonコードの共有です。

肉玉にゃんこ

膨大なファイルの中から任意の文字列が含まれるファイルを探す必要に駆られて作成しましたにゃ~

スポンサーリンク

コードの動作環境

  • OS:Windows11 / macOS Sequoia15.1
  • Pythonバージョン:3.11.2
  • 別途必要ライブラリ:
    • chardet:ファイルの文字コード(エンコーディング)を自動判定するために使用 ※文字化け防止
pip install chardet

任意のフォルダ内のテキストファイル内の文字列を一括検索するスクリプト

早速ですがスクリプトはこちら!

import os
import re
import chardet

def detect_encoding(file_path):
    """ファイルのエンコーディングを自動判定"""
    with open(file_path, 'rb') as f:
        raw_data = f.read()
    result = chardet.detect(raw_data)
    return result['encoding']

def search_in_files(directory, keyword):
    """指定フォルダ内のファイルからキーワードを検索"""
    # 対象とする拡張子
    target_extensions = ('.txt', '.tsv', '.csv', '.html', '.php', '.py')
    results = []

    # 指定フォルダ内のファイルを走査
    for root, _, files in os.walk(directory):
        for file in files:
            if file.endswith(target_extensions):
                file_path = os.path.join(root, file)
                try:
                    # ファイルのエンコーディングを判定
                    encoding = detect_encoding(file_path)
                    
                    # 判定されたエンコーディングでファイルを読み込む
                    with open(file_path, 'r', encoding=encoding, errors='ignore') as f:
                        for line_number, line in enumerate(f, start=1):
                            if re.search(keyword, line):
                                results.append((file_path, line_number, line.strip()))
                except Exception as e:
                    print(f"エラー: {file_path} を読み込めませんでした ({e})")
    
    return results

def main():
    """メイン処理"""
    # 検索対象ディレクトリを指定
    search_directory = input("検索対象のフォルダパスを入力してください: ")

    while True:
        # キーワード入力
        search_keyword = input("\n検索するキーワードを入力してください(終了するには 'exit' と入力): ")
        if search_keyword.lower() == 'exit':
            print("プログラムを終了します。")
            break
        
        # 検索実行
        matches = search_in_files(search_directory, search_keyword)

        # 結果表示
        if matches:
            print("\n検索結果:")
            for match in matches:
                print(f"ファイル: {match[0]}, 行番号: {match[1]}, 内容: {match[2]}")
        else:
            print("一致する結果は見つかりませんでした。")

if __name__ == "__main__":
    main()

コードは自動生成AI「Gemini 2.5 pro」で作成したものを元にカスタマイズしています。

自分用にカスタマイズする箇所は以下の通り。

  • 15行目:検索対象とする拡張子を必要に応じて追加・削除(テキストエディタで開くファイルであれば大体いけそうな感じ)

以下、具体的な使い方の流れですがとてもシンプルです。

▼pythonファイルを実行すると、このように「検索対象のフォルダパスを入力してください:」と表示されるので任意のフォルダパスを入力、またはコピーペーストします。

フォルダパスのコピー方法
【Windows11】
フォルダを右クリック→「パスのコピー」でファイルパスがコピーできますが、前後に「”」が含まれるのでメモ帳などで「”」を削除してからコピーペーストすると良いです。
【macOS】フォルダを右クリック→optionキーを押すと「コピー」が「”test”のパス名をコピー」に変わるのでクリック。

▼今回はこのようにデスクトップにある「input」フォルダを指定しました。入力したらエンターキーを押します。

▼続いて「検索するキーワードを入力してください」と表示されるので検索したい任意のテキストを入力します。今回は例として「猫」という文字を検索してみます。エンターキーで実行されます。

▼すると以下のように検索した文字列が含まれるファイルの場所、ファイル名、行番号といった情報が表示されます。

▼連続して検索ができるので、今度は「header」という文字列を検索してみます。

▼するとこのようにズラッと表示されました!ちなみにサブフォルダも検索対象なので、サブフォルダに格納していたphpファイル内の文字もバッチリ検索に引っかかってますね。

肉玉にゃんこ

かなりスピーディーに動くので使いやすいですにゃ~!

▼サクッとすぐに使えるように下記より.pyファイルのダウンロードも可能です(zip圧縮しています)。

→任意のフォルダ内のテキストファイル内の文字列を一括検索する.pyファイルをダウンロード

おわりに

本記事がどなたかの参考になれば幸いです。

今回は以上となります。
最後まで読んでいただきましてありがとうございました!
それではまた〜✧٩(ˊωˋ*)و✧

コメント