テキストデータ処理において、ログファイルやCSVデータなどの複数行テキストから、特定のキーワードが含まれる行のみを抜き出したい場面は多々あります。
Pythonでは、文字列の分割メソッドとリスト内包表記を組み合わせることで、この処理を非常に簡潔かつ高速に実装できます。ここでは、システムログから特定のエラーを含む行だけをフィルタリングして抽出するコード例を紹介します。
文字列のフィルタリング処理
特定の文字列を含む行を抽出する手順は以下の通りです。
- 行への分割: 対象のテキストデータを改行コードで行ごとのリストに分解します。
- フィルタリング: リスト内包表記を使用し、条件に一致する行(特定の文字列を含む行)のみを抽出します。
- 再結合: 抽出された行のリストを、再び改行コードで結合して1つのテキストデータに戻します。
実装例:エラーログの抽出
以下のコードは、システムログを模したテキストデータから、[ERROR] という文字列が含まれる行のみを抽出する例です。
def main():
# システムログを模したサンプルデータ
log_data = """[INFO] 2023-10-01 10:00:00 System booted successfully.
[INFO] 2023-10-01 10:05:23 User 'admin' logged in.
[ERROR] 2023-10-01 10:15:00 Database connection failed.
[WARNING] 2023-10-01 10:20:00 High memory usage detected.
[ERROR] 2023-10-01 10:22:30 Critical exception in module X.
[INFO] 2023-10-01 10:30:00 Scheduled maintenance started."""
# 1. 文字列を行ごとに分割する
# splitlines()を使用すると、\nや\r\nなどの改行コードを自動的に処理して分割します
lines = log_data.splitlines()
# 2. "[ERROR]" を含む行だけをリスト内包表記で抽出する
# lineの中にターゲット文字列が含まれているかを判定します
target_keyword = "[ERROR]"
error_lines = [line for line in lines if target_keyword in line]
# 3. 抽出した行を改行コードで結合して新しい文字列を作成する
filtered_log = "\n".join(error_lines)
# 結果の出力
print("--- 抽出されたエラーログ ---")
print(filtered_log)
if __name__ == "__main__":
main()
コードの解説
splitlines() メソッド 文字列を改行部分で区切り、リストとして返します。split('\n') と記述することも可能ですが、splitlines() は異なるOS間の改行コード(WindowsのCRLF、Unix系のLFなど)の違いを吸収してくれるため、より堅牢なコードになります。
リスト内包表記 [line for line in lines if target_keyword in line] の部分です。for ループを使って空のリストに append する従来の書き方と比較して、処理速度が速く、可読性も高くなります。
in 演算子 if target_keyword in line のように記述することで、文字列 line の中に target_keyword が含まれているかどうかを True / False で判定します。部分一致検索を簡単に行うための基本的な演算子です。
この手法はログ解析だけでなく、CSVデータの簡易的なフィルタリングや、特定の条件を満たす設定項目の抽出など、幅広い用途に応用可能です。
