
Pythonを使うと、データを一時的にメモリで扱うだけでなく、ファイルとして保存して“後から再利用できる”形に残すことができます。
これはプログラムに「記憶力」を与える行為です。
たとえば、日報やログを出力したり、ユーザー入力を保存したりする場面では必須の仕組みです。
本記事では、テキストファイルの読み書きを中心に、open関数・with構文の使い方、そして安全なリソース管理の考え方までを整理します。
Pythonの基礎知識(基礎編)
🟣 Pythonの基礎知識(基礎編)
📌基本文法から実用テクニックまで、Pythonの土台を固めるステップアップ講座
└─ 【Pythonの基礎知識(基礎編)】仕組みから学ぶ思考と自動化のプログラミング講座
├─ STEP 0:Pythonを動かす“仕組み”を理解する
| ├─【Pythonの基礎知識】Pythonを動かす環境とは何か? “自分専用の環境”を作る
| ├─【Pythonの基礎知識】Hello Worldの裏側にある実行の仕組み
| └─【Pythonの基礎知識】Pythonのファイル構造と実行パスを理解する
|
├─STEP 1:Pythonで“考える仕組み”を作る(思考編)
| ├─【Pythonの基礎知識】データ型で世界を定義する|数・文字・真偽の正体
| ├─【Pythonの基礎知識】変数と値の動きを通して仕組みを理解しよう
| ├─【Pythonの基礎知識】条件分岐で“判断を任せる”仕組みを作る
| ├─【Pythonの基礎知識】for文で“人の手”を離す仕組みを作る
| └─【Pythonの基礎知識】while文で“継続する仕組み”を作る
|
├─STEP 2:Pythonで“情報を扱う仕組み”を作る(構造編)
| ├─【Pythonの基礎知識】コレクション型の正しい選び方(list, tuple, dict, set)
| ├─【Pythonの基礎知識】リストで情報を整理し、仕組みに流れを持たせる
| ├─【Pythonの基礎知識】辞書型でデータを“意味”で管理する
| └─【Pythonの基礎知識】集合型で重複を排除し、無駄をなくす仕組みを作る
|
├─STEP 3:Pythonで“動きを再利用する仕組み”を作る(関数・モジュール編)
| ├─【Pythonの基礎知識】関数で処理を再利用する|“人間の手順”を仕組みに変える
| ├─【Pythonの基礎知識】引数と戻り値で“情報のやりとり”を自動化する
| ├─【Pythonの基礎知識】モジュールとパッケージで“仕組みを部品化”する
| └─【Pythonの基礎知識】importの裏側を理解し、コードを分離する設計思考
|
├─STEP 4:Pythonで“データを扱う仕組み”を作る(入出力・永続化編)
| ├─【Pythonの基礎知識】ファイル操作でデータを読み書きする仕組みを作る
| ├─【Pythonの基礎知識】CSVを自在に扱う仕組みを作る
| ├─【Pythonの基礎知識】JSONで構造化データを操る
| └─【Pythonの基礎知識】例外処理で“壊れない仕組み”を設計する
|
└─STEP 5:Pythonで“自動化する仕組み”を作る(応用実践編)
├─【Pythonの基礎知識】スクリプトを自動実行させる仕組みを作る
├─【Pythonの基礎知識】日次タスクを自動化して人の時間を解放する
├─【Pythonの基礎知識】外部APIを活用して作業を外部化する
└─【Pythonの基礎知識】ログを記録して仕組みの信頼性を高める
ファイル操作の基本と課題

プログラムで扱うデータは、実行中だけメモリに存在しており、終了すれば消えてしまいます。
これを解決するために登場するのが「ファイル操作」です。
Pythonでは、ファイルにデータを書き出し、次に起動した際にそれを再び読み込むことで、データを“永続化”する仕組みを簡単に実装できます。
ここでは、データを失わないための考え方から、open関数やwith構文を使った安全な書き込み方法まで順に整理していきます。
問題:プログラム終了でデータが失われる
プログラムで作成したデータは、変数としてメモリ上に一時的に存在しているだけです。
プログラムを終了すると、その変数はすべて破棄されます。
例えば、ユーザーが入力したメモを記録するアプリを作ったとしても、ファイル保存をしなければ次回起動時には内容が空になります。
一時的な変数を超えて、データを「残す」ことがプログラムの本質的な進化です。これができるかどうかで、ツールの価値が大きく変わります。
解決:ファイルを使った “永続化” の仕組み
Pythonでは、open関数を使ってファイルにデータを保存できます。
まずはファイルを開き、そこへデータを書き込み、最後に閉じる流れです。
ファイルを閉じる処理を忘れるとデータ破損の原因になるため、with構文を使って自動的に閉じるのが一般的です。
[ sample.py ]
with open("memo.txt", "w", encoding="utf-8") as f:
f.write("今日の進捗を記録します。")
上記形式で保存して python3 sample.py を実行すれば、カレントディレクトリに memo.txt が生成され、その中に文字列「今日の進捗を記録します。」が書き込まれます。
【出力例:】
memo.txt に「今日の進捗を記録します。」
このようにファイルへ書き込むことで、プログラム終了後も内容が残ります。
ファイルを再び開いて読み込めば、過去の記録を呼び出すことができます。
with open("memo.txt", "r", encoding="utf-8") as f:
print(f.read())
先ほどスクリプトで書き込んだ memo.txt を、今度は読み取る処理を示しています。
読み取り処理
- 書き込み保存後のファイルを指定する
- 今度はそのファイルを読み込んで中身を表示する[ r:(read)]
ここで "r" は「read(読み込み)」モードを意味します。
f.read() はファイル全体の内容を1つの文字列として取り出します。
したがって、先ほど書き込んだ「今日の進捗を記録します。」という文字列が、そのまま出力されるわけです。
【出力例:】
今日の進捗を記録します。
気づき:どのデータをいつ書き込むかが鍵
実際の開発現場では、ファイル操作そのものよりも「いつ書き込むか」「どの形式で残すか」が重要になります。
書き込みの頻度が多すぎると、パフォーマンスが落ちたりファイルが壊れやすくなります。
逆に、書き込みが遅れるとデータが失われるリスクが高まります。
保存するタイミングまで考えないといけないんですね。
このバランスを意識することで、単なるファイル操作が“システム設計”へと発展していきます。
Python におけるファイル読み書きの仕組み

Pythonでは、ファイル操作を通してデータを永続化し、プログラムの“記憶”を実現できます。
メモリ上で完結していたデータをファイルに保存することで、再起動後も内容を呼び出せるようになります。
ここでは、open関数の使い方やモード指定、そして安全なファイル操作を支えるwith構文の仕組みを整理していきます。
read/write モードと open 関数の使い方
Pythonでファイルを扱う際は、open関数を使ってファイルを開きます。
open関数は「ファイル名」と「モード」を指定して使用します。モードによって読み込み専用、書き込み専用、追記などの動作が変わります。
# ファイルを書き込みモードで開く
f = open("memo.txt", "w", encoding="utf-8")
f.write("メモ内容を書き込みます。")
f.close()
【出力例:】
memo.txt に「メモ内容を書き込みます。」
書き込みが完了したら、closeメソッドでファイルを閉じます。
閉じ忘れるとデータが正しく保存されなかったり、リソースが解放されないことがあります。
次に、同じファイルを読み込みモードで開くと、先ほど保存した内容を確認できます。
f = open("memo.txt", "r", encoding="utf-8")
print(f.read())
f.close()
【出力例:】
メモ内容を書き込みます。
with を使った安全なファイル操作
open関数とcloseメソッドを組み合わせる方法は基本ですが、より安全で確実な方法がwith構文です。
withを使えば、ファイル操作が終わったあと自動的に閉じてくれるため、エラーが発生してもリソースが確実に解放されます。
with open("memo.txt", "w", encoding="utf-8") as f:
f.write("今日の記録を残します。")
【出力例:】
memo.txt に「今日の記録を残します。」が保存される
このようにwith構文を使うと、closeを呼び出す必要がなく、ファイルの破損やリソースリークを防げます。開発現場ではこの方法が推奨されています。
ファイルモードが設計を左右する
ファイルモードとは、Pythonがファイルを開くときの“目的”を明示するものです。読み込みか書き込みか、既存ファイルを上書きするのか追記するのかを指定します。
モード一覧:
r → 読み込み専用(存在しないとエラー)
w → 新規作成/上書き
a → 追記(既存内容の末尾に追加)
r+ → 読み書き両方(上書き)
b → バイナリモード
t → テキストモード(デフォルト)
【出力例:】
例: open("data.txt", "a", encoding="utf-8") → 既存ファイルに追記
正しいモードを選ぶことは、単なる設定ではなく「破壊を防ぐ設計判断」です。
入出力バッファと性能の関係
ファイルI/Oにはバッファが存在します。
Pythonはデータを一度メモリ上でまとめ、ある程度たまったところでまとめて書き出します。
これにより処理効率が向上しますが、即時反映が必要な場合には flush() で強制的に出力する必要があります。
f = open("log.txt", "a", encoding="utf-8")
f.write("リアルタイム出力テスト")
f.flush()
【出力例:】
log.txt に即時に「リアルタイム出力テスト」が反映される
このように、バッファ制御を意識するだけで、ファイルI/Oの安定性と速度が大きく変わります。
気づき:ファイル操作はプログラム設計の一部
ファイルを「ただのデータ保存手段」と考えると、運用でつまずきます。
たとえば、大量のデータを1ファイルに詰め込む設計では、更新時にロックが発生して処理が止まることがあります。
一方で、1行ずつ別ファイルにすると管理コストが増える。どこまでを1単位として扱うか、いつ書き込むか——それはアプリの思想そのものです。
ファイルI/Oの仕組みを理解するということは、Pythonの動作原理を越えて“どう記録し、どう守るか”を考える力を身につけることです。
実践:データをファイルに書き出し、読込む処理

ここでは、実際にPythonでファイルを操作し、プログラムの動作記録を残す仕組みを作ります。
単に出力を保存するのではなく、ログという形で後から確認できるようにすることで、トラブル時の原因追跡や動作検証が容易になります。
ファイル操作の基礎を理解していれば、アプリの信頼性が大きく向上します。
コード例:簡易ログ保存のスクリプト
まず、簡単なログ出力スクリプトを作成します。このサンプルでは、実行内容をテキストファイルに追記し、プログラムの履歴として残します。
[ log_server.py ]
# log_saver.py
from datetime import datetime
log_file = "app_log.txt"
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
message = f"{timestamp} - 処理が正常に完了しました。"
with open(log_file, "a", encoding="utf-8") as f:
f.write(message + "\n")
【出力例:】
2025-11-02 07:20:45 - 処理が正常に完了しました。
この方法なら、毎回の実行履歴を上書きせず追加していくため、進行状況を時系列で追跡できます。
変数説明と注意点
上記のコードでは、変数の役割が明確に分かれています。それぞれの意味を整理しておくことで、誤操作を防ぎやすくなります。
| 変数名 | 役割 | 注意点 |
|---|---|---|
| log_file | 保存先ファイル名 | 既存ファイルがある場合は追記される |
| timestamp | 現在時刻の文字列 | datetimeモジュールのフォーマット指定を確認 |
| message | ログに出力する内容 | エラー文や進捗情報なども組み込める |
ただし、ファイル名や出力パスを間違えると、意図しない場所にログが作成される可能性があります。開発時には、相対パスではなく絶対パスで指定する方法も検討しましょう。
気づき:処理の流れと例外・リソース管理
ファイル操作では「どんなときに失敗するか」を意識することが重要です。
ディスク容量の不足、アクセス権の問題、文字コードの不一致など、さまざまな要因で書き込みに失敗することがあります。
try:
with open("app_log.txt", "a", encoding="utf-8") as f:
f.write("ログ書き込みテスト\n")
except Exception as e:
print("ログ書き込みに失敗しました:", e)
【出力例:】
ログ書き込みに失敗しました: [Errno 13] Permission denied: 'app_log.txt'
ファイルはプログラム外のリソースに依存しているため、確実に閉じる・例外を処理するという習慣が不可欠です。
ファイル操作は“データを扱う技術”であると同時に、“失敗に備える設計”でもあります。
応用と運用上の注意点

ファイル操作を実際の業務や運用に組み込む際には、単に読み書きができるだけでは不十分です。
システムの安定性やパフォーマンスを維持するためには、「どれだけのデータを扱い」「どこに保存し」「どのタイミングで書き込むか」という設計的な判断が欠かせません。
ここでは、実運用における注意点と最適な考え方を整理します。
ファイルサイズ・性能・メモリの観点からの注意
ファイル操作はデータ量が増えるほど性能に影響を与えます。
特に大量ログやバックアップファイルを扱う場合、単純な書き込み処理では速度が低下し、場合によってはシステムの停止を招くこともあります。
Pythonでは、一度に全データを読み込むのではなく「分割処理(チャンク読み込み)」を使うと効率的です。
with open("large_data.txt", "r", encoding="utf-8") as f:
for line in f:
# 行単位で処理
process(line)
【出力例:】
1行ずつ処理しながら読み込むため、メモリ使用量が一定に保たれる
この方法なら、どんなに大きなファイルでも安定した処理が可能です。
運用では、ファイルを圧縮して保存し、古いものを自動削除するスクリプトと組み合わせるとさらに安全です。
ファイルパス・存在チェック・エラー処理
運用で最も多いトラブルの一つが「存在しないパスへの書き込み」です。Pythonでは、ファイルを開く前にディレクトリの存在を確認し、必要であれば自動生成するようにします。
import os
dir_path = "logs"
if not os.path.exists(dir_path):
os.makedirs(dir_path)
file_path = os.path.join(dir_path, "system.log")
with open(file_path, "a", encoding="utf-8") as f:
f.write("監視ログを記録しました。\n")
【出力例:】
logs/system.log ファイルに「監視ログを記録しました。」が追記される
また、ファイルが開けない場合に備えてtry-except構文を組み合わせると、障害が発生してもログが途切れずに残ります。
try:
with open(file_path, "r", encoding="utf-8") as f:
print(f.readline())
except FileNotFoundError:
print("ファイルが存在しません。")
【出力例:】
ファイルが存在しません。
気づき:設計段階で「いつ/どこで/何を書くか」を決める
ファイル操作の真価は「仕組みを作った後」に表れます。どんなに安全なコードを書いても、どのタイミングでデータを保存するかを誤ると意味がありません。
これを防ぐには、処理の節目ごとに「確定データ」だけをファイルに出力する仕組みが有効です。
また、ファイル名や出力形式もあらかじめ設計に組み込むことで、運用担当者が迷わず管理できる環境を作れます。
ファイル操作とは、単なる入出力ではなく「プログラムが何を記録し、どこで責任を持つか」を設計する行為です。
その判断ができるようになると、システム全体の安定性と信頼性が一段上がります。
まとめ
ファイル操作は、単にデータを保存するための機能ではなく、プログラムに“記憶”を与える重要な仕組みです。
ファイルの開き方や書き込み方を正しく設計することで、データの損失を防ぎ、運用時のトラブルを最小限に抑えられます。
ファイルの扱いを理解するということは、「プログラムを動かす」から「動作を設計する」段階へと進むことです。
その一歩が、安定したアプリケーション開発への確かな基盤になります。
次のおすすめ記事
実践環境を整える
ここまで学んだ知識を実際に試すには、Linuxを動かす環境が必要です。手軽に始めるならVPSを利用するのがおすすめです。
→ VPS徹底比較!ConoHa・さくら・Xserverの選び方

