Python | データ出力ユーティリティ関数

Python
スポンサーリンク

ここからは、「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ファイル整理・重複防止

発展方向

次の段階として、次のような拡張が可能です👇

  1. logging 設定を外部ファイル(YAML / JSON)で管理
  2. pandas.DataFrame から自動で export_table_with_log を呼ぶ
  3. 処理全体を「ETLツール風」に構成(入力→変換→出力→ログ)
Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました