🐍

Pythonで複数ファイルから特定の文字列を含む行を抽出する

2022/07/12に公開

https://zenn.dev/t_takaji/articles/c12035e2a0d5e8 のバージョンアップ版です。
osモジュールを使えばシンプルに実装できました。

import os

# カレントディレクトリ
current_directory = os.getcwd().replace(os.sep, '/')

# 入出力のパス
input_path = current_directory + "/logs"
output_file = current_directory + "/result.txt"

# Grep検索対象
grep_target = 'Exception'


def init():
    """ 前回出力したファイルを削除する。 """
    os.chdir(input_path)

    is_file = os.path.isfile(output_file)
    if is_file:
        os.remove(output_file)

def read_files(file_path):
    """ ログファイルを読み込み、特定文字列を抽出する。 """
    with open(file_path, 'r', encoding="utf-8") as f:
        lines = f.readlines()
        # 指定した文字列を含む行を取得
        GREP_TARGET = [line for line in lines if grep_target in line]
        # 指定した文字列を含まない行を取得
        # GREP_TARGET = [line for line in lines if grep_target1 not in line]
        # and/orで条件追加できる
        # GREP_TARGET = [line for line in lines if grep_target1 in line or grep_target2 in line]

    with open(output_file, mode='a', encoding='utf-8') as f:
        f.writelines(GREP_TARGET)

init()

for file in os.listdir():
    file_path = f"{input_path}/{file}"
    read_files(file_path)

init()で毎回出力ファイルを削除しているのは、mode=aによる追加書き込みを行うためです。
(mode=wだとファイル読み込み毎に毎回上書きされてしまう。)

使い方

1)任意のパスに当プログラムを配置
2)同階層にlogsフォルダを作成
3)logsフォルダに読み込みたいファイルを配置
4)grep_target変数に検索したい文字列を記載し、プログラム実行

今後の開発

「この会員の操作ログが知りたい。」
「こんなエラーメッセージが出るんだけど。」
などのログ調査がたまに来ます。

会員を特定できる情報、特定の文字列があれば操作ログは追えますので、
本ツールを改良し、ワンボタンで会員の操作ログを抜き出すPythonプログラムを開発中です。
(セッション情報がログに出力されているなどの前提条件はあります。)
業務効率化のため、スキマ時間で作っていきます。

Discussion