概要
-
001_output.log
から100_output.log
までのログファイルをそれぞれ001_output.json
から100_output.json
と言うファイル名のJSON形式に変更する方法を紹介します。JSONは整形された状態で出力されるようにしています。- ログファイルは元からJSON形式のログという前提です(
.log
なので整形はされていない)
- ログファイルは元からJSON形式のログという前提です(
サンプルコード解説
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モジュールの関数であり、指定されたファイルを削除するために使用されます。削除したい場合はこちらを実行させます。