ここからは、「print+CSV+JSON出力」+「loggingでログも記録」 を一体化した
実務でも通用する「データ出力ユーティリティ関数」を作っていきましょう。
目的
- 表データを整形して print表示
- CSV・JSON に保存
- その操作内容を logging でファイルに記録
これにより、
「処理の履歴」と「出力データ」を自動で記録する
プロフェッショナルなスクリプト構成になります。
完成コード:export_table_with_log()
import csv
import json
import logging
from pathlib import Path
from datetime import datetime
from tabulate import tabulate
def setup_logger(logfile="output.log"):
"""ログ設定(ファイル+コンソールの両方に出力)"""
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(message)s",
handlers=[
logging.FileHandler(logfile, encoding="utf-8"),
logging.StreamHandler()
]
)
def export_table_with_log(data, headers, outdir="output", basename="result"):
"""
表データをprint表示しつつ、CSV・JSON出力とログ記録を同時に行う関数。
"""
# 出力フォルダを自動作成
Path(outdir).mkdir(parents=True, exist_ok=True)
# タイムスタンプ付きファイル名
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
basepath = Path(outdir) / f"{basename}_{timestamp}"
# === 1. コンソールに表を整形出力 ===
print(tabulate(data, headers=headers, tablefmt="grid"))
# === 2. CSV出力 ===
csv_path = f"{basepath}.csv"
with open(csv_path, "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow(headers)
writer.writerows(data)
logging.info(f"CSVファイル出力完了: {csv_path}")
# === 3. JSON出力 ===
json_path = f"{basepath}.json"
json_data = [dict(zip(headers, row)) for row in data]
with open(json_path, "w", encoding="utf-8") as f:
json.dump(json_data, f, ensure_ascii=False, indent=2)
logging.info(f"JSONファイル出力完了: {json_path}")
# === 4. 成功ログ ===
logging.info(f"データ出力処理が完了しました({len(data)}件)")
# ---------------------------
# 💻 使用例
# ---------------------------
if __name__ == "__main__":
setup_logger("output/system.log") # ロガー初期化
headers = ["名前", "年齢", "出身地"]
data = [
["Alice", 25, "Tokyo"],
["Bob", 31, "Osaka"],
["Charlie", 29, "Nagoya"]
]
export_table_with_log(data, headers, basename="people")
Python💻 実行結果(コンソール)
+----------+------+----------+
| 名前 | 年齢 | 出身地 |
+----------+------+----------+
| Alice | 25 | Tokyo |
| Bob | 31 | Osaka |
| Charlie | 29 | Nagoya |
+----------+------+----------+
2025-11-05 17:12:45 [INFO] CSVファイル出力完了: output/people_20251105_171245.csv
2025-11-05 17:12:45 [INFO] JSONファイル出力完了: output/people_20251105_171245.json
2025-11-05 17:12:45 [INFO] データ出力処理が完了しました(3件)
📁 出力ファイル構成例
output/
├── people_20251105_171245.csv
├── people_20251105_171245.json
└── system.log
解説
| 要素 | 説明 |
|---|---|
logging.basicConfig() | ログ設定を一括管理 |
FileHandler + StreamHandler | ファイルにもコンソールにも同時出力 |
Path.mkdir(parents=True) | 出力フォルダを自動で作成 |
datetime.now().strftime() | ファイル名に時刻スタンプを追加して重複防止 |
logging.info() | 正常動作の記録。logging.warning() や logging.error() にも対応可能 |
応用:エラーハンドリング付きバージョン(実務対応)
def safe_export_table(data, headers):
try:
export_table_with_log(data, headers, basename="safe_people")
except Exception as e:
logging.exception("出力処理でエラーが発生しました")
Pythonこれにより、エラー発生時もログにトレースバックが残り、原因解析が容易になります。
まとめ
| 機能 | 使用技術 | メリット |
|---|---|---|
| 表表示 | tabulate | 人間が読みやすい出力 |
| CSV / JSON 保存 | csv, json | 他ツールとの連携 |
| ログ出力 | logging | 実行履歴・エラー追跡 |
| 自動フォルダ・時刻付け | pathlib, datetime | ファイル整理・重複防止 |
発展方向
次の段階として、次のような拡張が可能です👇
- logging 設定を外部ファイル(YAML / JSON)で管理
- pandas.DataFrame から自動で export_table_with_log を呼ぶ
- 処理全体を「ETLツール風」に構成(入力→変換→出力→ログ)

