Pythonでリスト形式のデータをCSVファイルとして保存するには、csv モジュールの writer オブジェクトを使用します。 1行ずつ書き込む writerow() と、複数行をまとめて書き込む writerows() があり、状況に応じて使い分けることが可能です。
ここでは、基本的な書き込み方法と、文字化けや空行を防ぐための重要なポイントを解説します。
目次
1. 1行ずつ書き込む場合 (writerow)
ループ処理の中で計算結果を順次書き込みたい場合などに適しています。
実装例:売上データの記録
import csv
# 書き込むデータ(リストのリスト)
# 1行目はヘッダー、2行目以降がデータ
sales_data = [
["Date", "Product", "Price"],
["2025-01-01", "Apple", 120],
["2025-01-02", "Orange", 80],
["2025-01-03", "Banana", 150]
]
# 1. ファイルを書き込みモード('w')で開く
# newline="" はWindows環境で余計な空行が入るのを防ぐために必須です
# encoding="utf-8" は日本語を含む場合に文字化けを防ぎます
with open("sales_record.csv", "w", newline="", encoding="utf-8") as f:
# 2. Writerオブジェクトを作成
writer = csv.writer(f)
# 3. ループで1行ずつ書き込む
print("--- 書き込み開始 ---")
for row in sales_data:
writer.writerow(row)
print(f"書き込み完了: {row}")
print("--- 全ての処理が完了しました ---")
実行後のファイル内容 (sales_record.csv)
Date,Product,Price
2025-01-01,Apple,120
2025-01-02,Orange,80
2025-01-03,Banana,150
2. まとめて書き込む場合 (writerows)
既に2次元リスト(リストの中にリストが入っている状態)としてデータが用意されている場合は、ループを使わずに writerows() で一括書き込みを行うのが効率的です。
実装例:一括書き込み
import csv
# まとめて書き込みたいデータ
member_list = [
["ID", "Name", "Department"],
[1001, "Tanaka", "Sales"],
[1002, "Suzuki", "Engineering"],
[1003, "Sato", "HR"]
]
with open("members.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
# リスト全体を渡して一括書き込み
writer.writerows(member_list)
print("members.csv に一括書き込みしました。")
解説と注意点
重要なオプション引数
newline="":- Pythonの
open()関数でCSVファイルを書き込みモードで開く際、必ず指定してください。これを忘れると、Windows環境などで行と行の間に空白行が挟まる現象が発生します。
- Pythonの
encoding="utf-8"(または “cp932”):- 日本語(マルチバイト文字)を含む場合、エンコーディングを指定しないと文字化けする可能性があります。Excelで直接開くことを想定する場合は
encoding="cp932"(Shift_JIS) を指定することもありますが、現在は標準的なutf-8が推奨されます。
- 日本語(マルチバイト文字)を含む場合、エンコーディングを指定しないと文字化けする可能性があります。Excelで直接開くことを想定する場合は
追記モード (‘a’)
既存のファイルの内容を消さずに、末尾にデータを追加したい場合は、open() のモードを 'w'(上書き)ではなく 'a'(追記:append)にします。
# 既存のファイルに追記する例
with open("log.csv", "a", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow(["2025-12-19", "Log Entry", "Success"])
