PythonでCSVファイルにデータを書き出す場面は、処理結果の保存・レポートの生成・データのエクスポートなど様々な場面で出てきます。大量のデータを一度に書き込むだけでなく、1行ずつ逐次的に書き込む方法を知っておくとメモリ効率の高いプログラムが書けます。
Pythonの標準ライブラリのcsvモジュールには、csv.writerとwriterow()を組み合わせて1行ずつCSVに書き込む方法と、辞書形式で書き込めるcsv.DictWriterが用意されています。追記モードや文字コードの指定など、実務で必要な知識も合わせて押さえておきましょう。
この記事では、PythonでCSVを1行ずつ書き込む方法を、writerowの基本・DictWriter・追記処理・応用パターンまで、サンプルコードとともにわかりやすく解説していきます。
PythonでCSVを1行ずつ書き込むにはcsv.writerとwriterow()が基本
それではまず、PythonでCSVファイルに1行ずつ書き込む基本的な方法について解説していきます。
Pythonではcsv.writerにファイルオブジェクトを渡し、writerow()にリストを渡すことで1行分のCSVデータを書き込めます。カンマ区切りへの変換やクォート処理は自動で行われます。
import csv
# csv.writerとwriterow()で1行ずつ書き込む
with open("/home/claude/output.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
# ヘッダー行を書き込む
writer.writerow(["商品名", "価格", "在庫数"])
# データ行を1行ずつ書き込む
writer.writerow(["アボカド", 298, 50])
writer.writerow(["ドラゴンフルーツ", 498, 30])
writer.writerow(["サーモン", 1200, 20])
writer.writerow(["ゴリラ茶", 350, 100])
# 確認のため読み込んで表示
with open("/home/claude/output.csv", "r", encoding="utf-8") as f:
print(f.read())
# 出力結果:商品名,価格,在庫数
# 出力結果:アボカド,298,50
# 出力結果:ドラゴンフルーツ,498,30
# 出力結果:サーモン,1200,20
# 出力結果:ゴリラ茶,350,100
writerow()にリストを渡すたびに1行分のCSVデータが書き込まれます。数値もそのまま渡せばcsv.writerが自動的に文字列に変換してくれます。
writerows()でリストをまとめて書き込む
import csv
# writerows()でリストのリストをまとめて書き込む
header = ["商品名", "カテゴリ", "価格"]
rows = [
["キーボード", "PC周辺機器", 8500],
["マウス", "PC周辺機器", 2000],
["ネジ", "部品", 50],
["ボルト", "部品", 120],
]
with open("/home/claude/items.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
writer.writerow(header)
writer.writerows(rows) # リストをまとめて書き込む
with open("/home/claude/items.csv", "r", encoding="utf-8") as f:
print(f.read())
# 出力結果:商品名,カテゴリ,価格
# 出力結果:キーボード,PC周辺機器,8500
# 出力結果:マウス,PC周辺機器,2000
# 出力結果:ネジ,部品,50
# 出力結果:ボルト,部品,120
writerows()はリストのリストをまとめて書き込むメソッドです。事前にすべてのデータがリストとして揃っている場合はwriterowをループで呼ぶよりもスッキリ書けます。
ループ処理と組み合わせて1行ずつ書き込む
import csv
# 計算結果を1行ずつ書き込む
products = [
("アボカド", 298, 50),
("サーモン", 1200, 20),
("ドラゴンフルーツ", 498, 30),
]
with open("/home/claude/calc.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
writer.writerow(["商品名", "価格", "在庫数", "合計金額"])
for name, price, stock in products:
total = price * stock
writer.writerow([name, price, stock, total])
with open("/home/claude/calc.csv", "r", encoding="utf-8") as f:
print(f.read())
# 出力結果:商品名,価格,在庫数,合計金額
# 出力結果:アボカド,298,50,14900
# 出力結果:サーモン,1200,20,24000
# 出力結果:ドラゴンフルーツ,498,30,14940
ループの中でwriterow()を呼び出すことで、計算結果を逐次CSVに書き込めます。データが生成されるたびにすぐ書き込むため、大量データの処理でもメモリを圧迫しません。
csv.DictWriterで辞書形式のデータを書き込む方法
続いては、csv.DictWriterを使って辞書形式のデータをCSVに書き込む方法を確認していきます。
csv.DictWriterを使うと辞書のキーと列名を対応させてCSVに書き込めます。列の順番を気にせず書き込めるため、辞書形式のデータを扱う場合に非常に便利です。
DictWriterの基本的な使い方
import csv
# DictWriterで辞書形式のデータを書き込む
data = [
{"商品名": "ロバコーヒー", "価格": 420, "在庫": 80},
{"商品名": "ゴリラ茶", "価格": 350, "在庫": 100},
{"商品名": "アボカドジュース", "価格": 550, "在庫": 45},
]
fieldnames = ["商品名", "価格", "在庫"]
with open("/home/claude/dict_output.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
# ヘッダーを書き込む
writer.writeheader()
# 辞書を1行ずつ書き込む
for row in data:
writer.writerow(row)
with open("/home/claude/dict_output.csv", "r", encoding="utf-8") as f:
print(f.read())
# 出力結果:商品名,価格,在庫
# 出力結果:ロバコーヒー,420,80
# 出力結果:ゴリラ茶,350,100
# 出力結果:アボカドジュース,550,45
DictWriterはfieldnamesで列の順番を定義し、writeheader()でヘッダー行を書き込みます。辞書のキーと列名が一致していれば、辞書内のキーの順番に関わらず正しい列に書き込まれます。
extrasaction=’ignore’で余分なキーを無視する
import csv
# fieldnamesに含まれないキーを持つ辞書を書き込む
data = [
{"商品名": "キーボード", "価格": 8500, "在庫": 30, "備考": "人気商品"},
{"商品名": "マウス", "価格": 2000, "在庫": 50, "備考": "売れ筋"},
]
fieldnames = ["商品名", "価格", "在庫"]
with open("/home/claude/ignore_extra.csv", "w", encoding="utf-8", newline="") as f:
# extrasaction='ignore'で余分なキーを無視
writer = csv.DictWriter(f, fieldnames=fieldnames, extrasaction="ignore")
writer.writeheader()
writer.writerows(data)
with open("/home/claude/ignore_extra.csv", "r", encoding="utf-8") as f:
print(f.read())
# 出力結果:商品名,価格,在庫
# 出力結果:キーボード,8500,30
# 出力結果:マウス,2000,50
デフォルトではfieldnamesにないキーがあるとValueErrorが発生しますが、extrasaction=”ignore”を指定することで余分なキーを無視して書き込めます。APIレスポンスなど余分なフィールドを含む辞書を扱う場面で便利です。
writerとDictWriterの使い分け
| 方法 | データ形式 | ヘッダー書き込み | 向いている場面 |
|---|---|---|---|
| csv.writer | リスト | writerow()で手動 | シンプルなCSV生成 |
| csv.DictWriter | 辞書 | writeheader()で自動 | 辞書データ・列名管理が必要な場面 |
CSVに追記する方法
続いては、既存のCSVファイルにデータを追記する方法を確認していきます。
ログの蓄積・定期的なデータ更新など、既存のCSVファイルを上書きせずに末尾にデータを追加したい場面はよくあります。open()のモードを”a”(追記モード)に変更するだけで対応できます。
追記モード(”a”)でCSVに書き込む
import csv
# まず初期ファイルを作成
with open("/home/claude/log.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
writer.writerow(["日時", "商品名", "売上"])
writer.writerow(["2026-02-18", "アボカド", 29800])
# 追記モードで新しいデータを追加
with open("/home/claude/log.csv", "a", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
writer.writerow(["2026-02-19", "サーモン", 60000])
writer.writerow(["2026-02-20", "ドラゴンフルーツ", 14940])
with open("/home/claude/log.csv", "r", encoding="utf-8") as f:
print(f.read())
# 出力結果:日時,商品名,売上
# 出力結果:2026-02-18,アボカド,29800
# 出力結果:2026-02-19,サーモン,60000
# 出力結果:2026-02-20,ドラゴンフルーツ,14940
open()のモードを”w”(上書き)から”a”(追記)に変えるだけで、既存のデータを保持したまま末尾に追加できます。ヘッダー行は最初の1回だけ書き込む点に注意しましょう。
ファイルが存在するかどうかでヘッダー書き込みを制御する
import csv
import os
def append_to_csv(filepath, row_data, headers):
"""ファイルの有無に応じてヘッダー付きで追記する"""
file_exists = os.path.exists(filepath)
with open(filepath, "a", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
# ファイルが新規作成のときだけヘッダーを書く
if not file_exists:
writer.writerow(headers)
writer.writerow(row_data)
headers = ["商品名", "価格", "日付"]
# 呼び出すたびに自動でヘッダー制御
append_to_csv("/home/claude/auto_log.csv", ["ネジ", 50, "2026-02-20"], headers)
append_to_csv("/home/claude/auto_log.csv", ["ボルト", 120, "2026-02-20"], headers)
append_to_csv("/home/claude/auto_log.csv", ["ワッシャー", 30, "2026-02-20"], headers)
with open("/home/claude/auto_log.csv", "r", encoding="utf-8") as f:
print(f.read())
# 出力結果:商品名,価格,日付
# 出力結果:ネジ,50,2026-02-20
# 出力結果:ボルト,120,2026-02-20
# 出力結果:ワッシャー,30,2026-02-20
os.path.exists()でファイルの存在確認をしてヘッダーの書き込みを制御するパターンです。何度呼んでもヘッダーが重複しない安全な追記関数として実務でよく使われます。
タイムスタンプ付きでログをCSVに記録する
import csv
import os
from datetime import datetime
def write_log(message, level="INFO"):
filepath = "/home/claude/app_log.csv"
file_exists = os.path.exists(filepath)
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with open(filepath, "a", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
if not file_exists:
writer.writerow(["タイムスタンプ", "レベル", "メッセージ"])
writer.writerow([timestamp, level, message])
write_log("アボカドのデータ読み込み完了")
write_log("ドラゴンフルーツの在庫不足", level="WARNING")
write_log("サーモンの処理でエラー発生", level="ERROR")
with open("/home/claude/app_log.csv", "r", encoding="utf-8") as f:
print(f.read())
# 出力結果:タイムスタンプ,レベル,メッセージ
# 出力結果:2026-02-20 14:30:45,INFO,アボカドのデータ読み込み完了
# 出力結果:2026-02-20 14:30:45,WARNING,ドラゴンフルーツの在庫不足
# 出力結果:2026-02-20 14:30:45,ERROR,サーモンの処理でエラー発生
タイムスタンプ付きのCSVログは実務のアプリケーション開発でよく使われるパターンです。Excelで開いて確認しやすい形式であるため、非エンジニアへの共有にも向いています。
CSV書き込みの応用パターン
続いては、CSV書き込みの実践的な応用パターンを確認していきます。
基本的な書き込みの他に、区切り文字のカスタマイズ・Shift-JIS出力・クォートの制御など、実務で必要な応用知識を押さえておきましょう。
Shift-JIS(Excel対応)でCSVを書き出す
import csv
# WindowsのExcelで開けるShift-JIS形式で書き出す
data = [
["商品名", "価格", "在庫"],
["キーボード", 8500, 30],
["パソコン", 120000, 10],
["モニター", 35000, 15],
]
with open("/home/claude/excel_output.csv", "w",
encoding="shift-jis", newline="") as f:
writer = csv.writer(f)
writer.writerows(data)
print("Shift-JIS形式でCSVを出力しました。")
# 出力結果:Shift-JIS形式でCSVを出力しました。
WindowsのExcelはデフォルトでShift-JISのCSVを開くため、日本語データをExcelで確認してもらう場合はencoding=”shift-jis”での出力が必要です。
タブ区切り(TSV)で書き出す
import csv
# タブ区切りで書き出す
data = [
["商品名", "価格", "カテゴリ"],
["ネジ", 50, "部品"],
["アボカド", 298, "食品"],
["キーボード", 8500, "PC周辺機器"],
]
with open("/home/claude/output.tsv", "w", encoding="utf-8", newline="") as f:
writer = csv.writer(f, delimiter="\t")
writer.writerows(data)
with open("/home/claude/output.tsv", "r", encoding="utf-8") as f:
print(f.read())
# 出力結果:商品名 価格 カテゴリ
# 出力結果:ネジ 50 部品
# 出力結果:アボカド 298 食品
# 出力結果:キーボード 8500 PC周辺機器
csv.writer()のdelimiterパラメータに”\t”を指定するだけでタブ区切り形式に変更できます。データにカンマが含まれる場合はTSV形式の方がシンプルに扱えることがあります。
クォートの挙動を制御する
import csv
data = [
["商品名", "説明", "価格"],
["アボカド", "濃厚でクリーミー、栄養満点", 298],
["サーモン", "新鮮な刺身用", 1200],
]
# QUOTE_ALL:すべてのフィールドをクォートで囲む
with open("/home/claude/quoted.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.writer(f, quoting=csv.QUOTE_ALL)
writer.writerows(data)
with open("/home/claude/quoted.csv", "r", encoding="utf-8") as f:
print(f.read())
# 出力結果:"商品名","説明","価格"
# 出力結果:"アボカド","濃厚でクリーミー、栄養満点","298"
# 出力結果:"サーモン","新鮮な刺身用","1200"
csv.QUOTE_ALLを指定するとすべてのフィールドがダブルクォートで囲まれます。他のシステムへのデータ連携でクォートが必須な場合や、データの安全性を高めたい場合に使えるオプションです。
まとめ
この記事では、PythonでCSVを1行ずつ書き込む方法について、csv.writerとwriterow()の基本・DictWriterによる辞書形式の書き込み・追記処理・応用パターンまで幅広く解説しました。
CSVへの基本的な書き込みにはcsv.writerとwriterow()を使い、open()にはnewline=””とencoding=”utf-8″の指定が必須です。辞書形式のデータにはcsv.DictWriterが便利で、writeheader()でヘッダーを自動出力できます。既存ファイルへの追記には”a”モードを使い、os.path.exists()でヘッダーの重複書き込みを防ぎましょう。
WindowsのExcel向けのShift-JIS出力・タブ区切りへの対応・タイムスタンプ付きログ記録など、今回紹介したパターンは実務のCSV出力処理でそのまま活用できるものばかりです。ぜひ実際のプロジェクトで試してみてください。