Pythonでプログラムの処理結果をファイルに保存したい場面は、ログの出力・レポートの生成・データのエクスポートなど様々な状況で出てきます。ファイルへの書き込みはPythonプログラミングの基本操作のひとつで、open()とwrite()の組み合わせを理解しておくと幅広い処理に対応できます。
Pythonではopen()でファイルを開いてwrite()で文字列を書き込む方法が基本です。新規作成・上書き・追記など書き込みモードの使い分けや、with文を使ったファイルのクローズ忘れ防止も合わせて押さえておきましょう。
この記事では、Pythonでファイルに書き込む方法を、open()とwrite()の基本・書き込みモードの違い・writelines()・追記処理・応用パターンまで、サンプルコードとともにわかりやすく解説していきます。
Pythonでファイルに書き込むにはopen()とwrite()の組み合わせが基本
それではまず、Pythonでファイルに文字列を書き込む基本的な方法について解説していきます。
Pythonでファイルに書き込むには、open()でファイルオブジェクトを取得し、write()で文字列を書き込み、close()でファイルを閉じるという流れが基本です。with文を使うとclose()が自動化されるため、より安全なコードが書けます。
# with文を使った基本的なファイル書き込み
with open("/home/claude/output.txt", "w", encoding="utf-8") as f:
f.write("アボカドとサーモンとドラゴンフルーツ\n")
f.write("ゴリラ茶とロバコーヒー\n")
# 書き込んだ内容を確認
with open("/home/claude/output.txt", "r", encoding="utf-8") as f:
print(f.read())
# 出力結果:アボカドとサーモンとドラゴンフルーツ
# 出力結果:ゴリラ茶とロバコーヒー
open()の第1引数にファイルパス、第2引数に書き込みモード(”w”)、encodingに文字コードを指定します。write()に渡した文字列がそのまま書き込まれます。改行は\nで明示的に指定する必要があります。
書き込みモードの種類と使い分け
| モード | 動作 | ファイルが存在する場合 | 用途 |
|---|---|---|---|
| “w” | 書き込み | 中身を消して上書き | 新規作成・上書き保存 |
| “a” | 追記 | 末尾に追加 | ログの蓄積・データ追加 |
| “x” | 排他的作成 | FileExistsError | 新規作成のみ許可 |
| “w+” | 読み書き | 中身を消して上書き | 書き込み後に読み込みも行う |
| “wb” | バイナリ書き込み | 中身を消して上書き | 画像・PDFなどのバイナリ |
write()の戻り値と書き込み文字数
# write()は書き込んだ文字数を返す
with open("/home/claude/count_test.txt", "w", encoding="utf-8") as f:
count1 = f.write("キーボード\n")
count2 = f.write("マウス\n")
count3 = f.write("モニター\n")
print(f"1行目:{count1}文字")
print(f"2行目:{count2}文字")
print(f"3行目:{count3}文字")
# 出力結果:1行目:6文字
# 出力結果:2行目:4文字
# 出力結果:3行目:5文字
write()は書き込んだ文字数を整数で返します。通常は戻り値を使わないことがほとんどですが、書き込み量の確認やデバッグに活用できます。
“x”モードで新規作成のみ許可する
import os
# "x"モードはファイルが存在する場合はエラー
filepath = "/home/claude/new_file.txt"
# 既存ファイルを削除してからテスト
if os.path.exists(filepath):
os.remove(filepath)
# 新規作成(成功)
try:
with open(filepath, "x", encoding="utf-8") as f:
f.write("新規作成されたファイルです\n")
print("新規作成成功")
except FileExistsError:
print("エラー:ファイルが既に存在します。")
# 同じファイルに再度"x"モードで開こうとする(失敗)
try:
with open(filepath, "x", encoding="utf-8") as f:
f.write("上書きしようとします\n")
except FileExistsError:
print("エラー:ファイルが既に存在します。上書きを防ぎました。")
# 出力結果:新規作成成功
# 出力結果:エラー:ファイルが既に存在します。上書きを防ぎました。
“x”モードはファイルが既に存在する場合にFileExistsErrorを発生させるため、誤った上書きを防ぎたい場面で安全に使えます。
writelines()で複数行を一括書き込みする方法
続いては、writelines()を使って複数行をまとめてファイルに書き込む方法を確認していきます。
write()が1回につき1つの文字列を書き込むのに対して、writelines()はリストや文字列のイテラブルを渡して複数の文字列を一括で書き込めます。
writelines()の基本的な使い方
# writelines()でリストを一括書き込み
lines = [
"アボカド\n",
"ドラゴンフルーツ\n",
"サーモン\n",
"ゴリラ茶\n",
"ロバコーヒー\n",
]
with open("/home/claude/fruits.txt", "w", encoding="utf-8") as f:
f.writelines(lines)
with open("/home/claude/fruits.txt", "r", encoding="utf-8") as f:
print(f.read())
# 出力結果:アボカド
# 出力結果:ドラゴンフルーツ
# 出力結果:サーモン
# 出力結果:ゴリラ茶
# 出力結果:ロバコーヒー
writelines()はリスト内の文字列をそのまま順に書き込みます。write()と同様に改行コードは自動では挿入されないため、各要素に\nを含める必要があります。
join()で改行を付けてwritelines()を使う
# \nを事前に追加してwritelines()に渡す
items = ["ネジ", "ボルト", "ワッシャー", "ナット"]
# 方法1:リスト内包表記で\nを付加
lines = [item + "\n" for item in items]
with open("/home/claude/parts.txt", "w", encoding="utf-8") as f:
f.writelines(lines)
# 方法2:join()でまとめてwrite()
with open("/home/claude/parts2.txt", "w", encoding="utf-8") as f:
f.write("\n".join(items) + "\n")
# 両方の結果を確認
with open("/home/claude/parts.txt", "r", encoding="utf-8") as f:
print("writelines():")
print(f.read())
# 出力結果:writelines():
# 出力結果:ネジ
# 出力結果:ボルト
# 出力結果:ワッシャー
# 出力結果:ナット
リスト内包表記で各要素に\nを付加してwritelines()に渡す方法と、join()で結合してwrite()で一括書き込みする方法はどちらも実務でよく使われるパターンです。
write()とwritelines()の使い分け
| メソッド | 引数 | 改行の扱い | 向いている場面 |
|---|---|---|---|
| write() | 文字列1つ | 手動で\nを指定 | 1行ずつ逐次書き込み |
| writelines() | イテラブル | 手動で\nを指定 | リストの一括書き込み |
| print(file=) | 文字列1つ | 自動で改行を追加 | 改行を自動追加したい場面 |
ファイルへの追記と既存内容の確認方法
続いては、”a”モードを使った追記処理と既存内容との組み合わせ方を確認していきます。
ログの蓄積・データの追加・定期的な更新処理など、既存のファイルを消さずに末尾にデータを追加したい場面では”a”モード(追記モード)を使います。
“a”モードで追記する基本パターン
# まず初期ファイルを作成
with open("/home/claude/log.txt", "w", encoding="utf-8") as f:
f.write("=== ログ開始 ===\n")
f.write("アボカドを処理しました\n")
# "a"モードで追記
with open("/home/claude/log.txt", "a", encoding="utf-8") as f:
f.write("サーモンを処理しました\n")
f.write("ドラゴンフルーツを処理しました\n")
# さらに追記
with open("/home/claude/log.txt", "a", encoding="utf-8") as f:
f.write("=== ログ終了 ===\n")
with open("/home/claude/log.txt", "r", encoding="utf-8") as f:
print(f.read())
# 出力結果:=== ログ開始 ===
# 出力結果:アボカドを処理しました
# 出力結果:サーモンを処理しました
# 出力結果:ドラゴンフルーツを処理しました
# 出力結果:=== ログ終了 ===
“a”モードで開くと既存の内容を保持したまま末尾にデータが追加されます。何度開いて書き込んでも内容が蓄積され続けます。
タイムスタンプ付きログをファイルに書き込む
from datetime import datetime
import os
def write_log(message, level="INFO", filepath="/home/claude/app.log"):
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
log_line = f"[{timestamp}] [{level}] {message}\n"
with open(filepath, "a", encoding="utf-8") as f:
f.write(log_line)
# ログを書き込む
write_log("アボカドのデータ読み込み完了")
write_log("ドラゴンフルーツの在庫が少なくなっています", level="WARNING")
write_log("サーモンの処理でエラー発生", level="ERROR")
with open("/home/claude/app.log", "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] サーモンの処理でエラー発生
タイムスタンプ・ログレベル・メッセージを含むログ行を”a”モードで追記し続けるパターンはアプリケーション開発の実務でよく使われます。
print()のfileパラメータでファイルに書き込む
# print()のfile引数でファイルに書き込む
with open("/home/claude/print_output.txt", "w", encoding="utf-8") as f:
print("キーボード", file=f)
print("マウス", file=f)
print("モニター", file=f)
print(f"合計:3件", file=f)
with open("/home/claude/print_output.txt", "r", encoding="utf-8") as f:
print(f.read())
# 出力結果:キーボード
# 出力結果:マウス
# 出力結果:モニター
# 出力結果:合計:3件
print()のfile引数にファイルオブジェクトを渡すと、print()の出力先をファイルに変更できます。write()と違い改行が自動で付加されるため、1行ずつ書き込む場合はprint()の方がシンプルなコードになります。
ファイル書き込みの応用パターン
続いては、ファイル書き込みを活用した実践的な応用パターンを確認していきます。
ファイル書き込みはHTMLファイルの生成・設定ファイルの作成・処理結果のレポート出力など様々な場面で活用できます。
HTMLファイルを生成する
# 商品一覧HTMLを生成する
products = [
{"name": "アボカド", "price": 298, "stock": 50},
{"name": "サーモン", "price": 1200, "stock": 20},
{"name": "キーボード", "price": 8500, "stock": 30},
]
html_lines = [
"\n",
"\n",
"\n",
"商品一覧
\n",
"\n",
"商品名 価格 在庫 \n",
]
for p in products:
html_lines.append(
f"{p['name']} {p['price']}円 {p['stock']}個 \n"
)
html_lines += ["
\n", "\n", "\n"]
with open("/home/claude/products.html", "w", encoding="utf-8") as f:
f.writelines(html_lines)
print("HTMLファイルを生成しました。")
with open("/home/claude/products.html", "r", encoding="utf-8") as f:
print(f.read())
# 出力結果:HTMLファイルを生成しました。
# 出力結果:
# 出力結果:
# 出力結果:
# 出力結果:商品一覧
# 出力結果:
# 出力結果:商品名 価格 在庫
# 出力結果:アボカド 298円 50個
# 出力結果:(以下繰り返し)
writelines()を使ってHTMLの行をリストから一括書き込みするパターンです。データを動的に埋め込んだHTMLファイルを生成する際の基本的な実装方法です。
ファイルに書き込む前にバックアップを取る
import shutil
import os
from datetime import datetime
def safe_write(filepath, content):
"""既存ファイルをバックアップしてから書き込む"""
# 既存ファイルのバックアップ
if os.path.exists(filepath):
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
backup_path = f"{filepath}.{timestamp}.bak"
shutil.copy2(filepath, backup_path)
print(f"バックアップ作成:{backup_path}")
with open(filepath, "w", encoding="utf-8") as f:
f.write(content)
print(f"書き込み完了:{filepath}")
# 初回書き込み
safe_write("/home/claude/config.txt", "設定バージョン1\nアボカド=298\n")
# 上書き(バックアップが自動作成される)
safe_write("/home/claude/config.txt", "設定バージョン2\nアボカド=350\n")
# 出力結果:書き込み完了:/home/claude/config.txt
# 出力結果:バックアップ作成:/home/claude/config.txt.20260220_143045.bak
# 出力結果:書き込み完了:/home/claude/config.txt
shutil.copy2()で上書き前にタイムスタンプ付きのバックアップを作成するパターンです。重要なファイルを更新する処理では、誤った上書きからデータを守るためにこのような安全な書き込み関数を用意しておくと安心です。
まとめ
この記事では、Pythonでファイルに書き込む方法について、open()とwrite()の基本・書き込みモードの使い分け・writelines()・追記処理・応用パターンまで幅広く解説しました。
ファイル書き込みの基本はwith文でopen()を使い、write()で文字列を書き込むパターンです。”w”モードは上書き、”a”モードは追記と書き込みモードを正しく使い分けることが大切です。複数行を一括書き込みするにはwritelines()が便利で、改行の自動付加が不要な場面ではprint(file=)もシンプルな選択肢です。
タイムスタンプ付きログ・HTML生成・バックアップ付き安全書き込みなど、今回紹介したパターンは実務でそのまま活用できるものばかりです。ぜひ実際のプロジェクトで試してみてください。
ファイル書き込みでは必ずwith文を使ってopen()を呼び出しましょう。with文を使うことでファイルのクローズ忘れを防げます。また”w”モードは既存ファイルを上書きするため、重要なファイルを扱う場合は”a”モードや”x”モードの使用、またはバックアップ作成を検討しましょう。encoding=”utf-8″の指定も文字化けを防ぐために必須です。
スポンサーリンク
スポンサーリンク