CSVの作業ノート

使い方のノート · 2026年10月3日

PythonでCSVを結合する最小のスクリプト

標準ライブラリだけで、UTF-8のCSVを見出し付きで結合します。

使い方

Python 3が使える環境で、下のコードをmerge_csv.pyとして保存します。同じ場所にinputフォルダを作り、見出しが同じUTF-8 CSVを2個以上入れてください。出力先のmerged.csvは上書きされるため、必要なら先に退避してください。

import csv
from pathlib import Path

files = sorted(Path("input").glob("*.csv"))
if len(files) < 2:
    raise ValueError("inputに2個以上のCSVが必要です")
rows = []
header = None
for path in files:
    with path.open(encoding="utf-8-sig", newline="") as f:
        reader = csv.reader(f, strict=True)
        current = next(reader, None)
        if current is None:
            raise ValueError(f"空のCSV: {path}")
        if header is None:
            header = current
        if current != header:
            raise ValueError(f"見出しが不一致: {path}")
        for row in reader:
            if len(row) != len(header):
                raise ValueError(f"列数が不一致: {path}")
            rows.append(row)

with Path("merged.csv").open("w", encoding="utf-8-sig", newline="") as f:
    writer = csv.writer(f)
    writer.writerow(header)
    writer.writerows(rows)
print(f"データ{len(rows)}行を書き出しました")
python3 merge_csv.py

Windowsなど、Pythonのコマンド名がpythonの場合は読み替えてください。utf-8-sigは読み込み時にBOMがあれば除去し、書き込み時にはBOMを付けます。

改行で分割しない理由

CSVのセルには引用符で囲まれた改行が入る場合があります。単純な文字列の行分割やカンマ分割では、こうした値を壊します。csv.readerとcsv.writerに解析と出力を任せ、ファイルはnewline=""で開きます。Python公式のcsvドキュメント

この例の制限

データはメモリに保持します。巨大なファイル向けのストリーミング処理ではありません。列順の自動調整、文字コードの自動判定、重複削除、型の変換はしません。Shift_JIS入力の場合は読み込み側のencodingを変更し、すべてのファイルで同じ文字コードを使ってください。

使い方の一覧へ