概要
-
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モジュールの関数であり、指定されたファイルを削除するために使用されます。削除したい場合はこちらを実行させます。