0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Python】大量のlogファイルをJSON整形されたJSONファイルに一瞬で変換する方法

Posted at

概要

  • 001_output.logから100_output.logまでのログファイルをそれぞれ001_output.jsonから100_output.jsonと言うファイル名のJSON形式に変更する方法を紹介します。JSONは整形された状態で出力されるようにしています。
    • ログファイルは元からJSON形式のログという前提です(.logなので整形はされていない)

サンプルコード解説

import os
import json

for i in range(1, 101):
    # ログファイルとJSONファイルのパスを指定
    log_file_path = f"./output_files/{str(i).zfill(3)}_output.log"
    json_file_path = f"./output_files/{str(i).zfill(3)}_output.json"

    try:
        with open(log_file_path, "r", encoding="utf-8") as log_file:
            log_content = log_file.read()

            # JSON形式に変換
            log_data = json.loads(log_content)

        with open(json_file_path, "w", encoding="utf-8") as json_file:
            # JSON形式に整形して書き込み
            json.dump(log_data, json_file, ensure_ascii=False, indent=4)

        # 元のログファイルを削除したい場合
        # os.remove(log_file_path)

    except (FileNotFoundError, json.JSONDecodeError) as e:
        print(f"変換エラー: {log_file_path} - {e}")

ざっくり解説

  • 読み込むログファイルのパスと書き込むJSONファイルのパスをはじめに定義します。
  • with文は、ファイルの操作が終了したら自動的にファイルを閉じるための構文です。"r"は読み込みモードでファイルを開くことを指定しています。
  • 次に、ログファイルの内容を文字列として読み込み、変数log_contentに格納し、これをJSON形式に変換してlog_dataという変数に代入。
  • with文の"w"書き込みモードのところで、json.dumpを使ってlog_dataの内容をJSON形式で書き込みます。

ゼロパディングについて

  • 今回、1ではなく、001というように、桁数に満たない部分をゼロで埋めています。必要ない場合は、zfillのところを変更して下さい。ちなみに以下の記法もあります。
{i:03}_output.log

日本語のエンコードエラーが起きた場合

  • 日本語のエンコードエラーが発生した場合は、以下の対応をします。
    • ログファイルの読み込みと書き込み時にencoding="utf-8"を指定。また、JSONファイルへの書き込み時にはensure_ascii=Falseを指定して、Unicode文字をエスケープせずに書き込むようにする。

JSONフォーマットへの整形とエラー処理

  • json.dump関数のindent=4を追加することで、JSONデータが整形され、可読性のある形式で書き込まれます。このindentを忘れると読みづらいJSONファイルができてしまいますので要注意。
    • インデントの数やスペースの量など、整形の詳細はカスタマイズ可能
  • もしJSON形式になっていないログファイルがある場合、json.JSONDecodeErrorが発生しますのでexceptで捕捉。

os.removeについて

  • サンプルコードではコメントアウトしていますが、os.remove(log_file_path)は、指定されたパスにあるファイルを削除するためのコードです。
  • os.remove()は、osモジュールの関数であり、指定されたファイルを削除するために使用されます。削除したい場合はこちらを実行させます。
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?