Pythonの「ファイル操作」をマスターしよう:データの読み取りから安全な保存まで
![]()
【Yuki】
Hirokiくん、こんにちは。今日はPythonの「ファイル入出力」について一緒にお勉強しましょうか。
プログラミングをしていると、プログラムを終了した後もデータを残しておきたい、あるいはすでにあるテキストデータを取り込んで処理したい、という場面が必ず出てきます。
普段、わたしたちが何気なく扱っているテキストファイルやログファイルも、Pythonを使えば自由自在に操作できるんですよ。
![]()
【Hiroki】
Yukiさん、よろしくお願いします!
そうですね、せっかく計算した結果も、プログラムを閉じたら消えてしまうのはもったいないなと思っていました。
ファイルに保存できれば、他のプログラムで使ったり、後で見返したりできますよね。でも、ファイルを「開く」とか「閉じる」とか、少し難しそうなイメージがあります……。
![]()
【Yuki】
ふふ、大丈夫ですよ。基本さえ押さえれば、それほど複雑なことではありません。
Pythonにはファイルを扱うためのとても便利な仕組みが備わっているんです。
まずは、一番基本的な「ファイルを開いて、閉じる」という流れから見ていきましょう。
1. ファイル操作の基本:open() と close()
![]()
【Yuki】
ファイル操作の基本は、「開く(open)」「読み書きする」「閉じる(close)」という3つのステップで成り立っています。
現実の世界でノートに何かを書くときと同じですね。まず表紙をめくって、中身を読み書きして、終わったらパタンと閉じる……。
Pythonでは、open() という関数を使ってファイルを開きます。
# ファイルを書き込みモードで開く
f = open("test.txt", "w")
# 何か処理をする
f.write("Hello, Python!")
# ファイルを閉じる
f.close()
![]()
【Hiroki】
open() の中にある "test.txt" はファイル名ですよね。その隣にある "w" というのは何ですか?
![]()
【Yuki】
それは「モード」と呼ばれるものです。
"w" は Write(書き込み) の頭文字で、「新しくファイルを作って書き込みますよ」という意味になります。
もし "test.txt" というファイルがすでにあった場合は、中身が全部消えて上書きされてしまうので注意が必要です。
読み込みたいときは "r"(Read)、追記したいときは "a"(Append)を使います。
![]()
【Hiroki】
なるほど、用途に合わせてモードを指定するんですね。
最後に f.close() を忘れてはいけない理由は何でしょうか?
![]()
【Yuki】
いい質問ですね。ファイルを開いたままにしておくと、コンピュータのメモリなどの資源を無駄に使い続けてしまったり、他のプログラムがそのファイルを使えなくなってしまったりすることがあるんです。
最悪の場合、データが正しく保存されないこともあります……。
でも、人間だもの、どうしても「閉じる」のを忘れてしまうことってありますよね。
わたしも、夜遅くまで作業に没頭していると、ついつい出しっぱなしにしてしまうことがあって……。
![]()
【Hiroki】
あはは、Yukiさんでも忘れ物をするんですね。ちょっと安心しました。
![]()
【Yuki】
……うう、恥ずかしいです。でも、そんな「うっかり」を防いでくれる、もっとスマートな書き方があるんですよ。
2. より安全な「with構文」の使い方
![]()
【Yuki】
Pythonには with 構文 という非常に便利な仕組みがあります。
これを使うと、ブロックを抜けたときに自動的にファイルを閉じてくれるんです。
現在のPythonプログラムでは、こちらの書き方が一般的ですね。
with open("sample.txt", "w", encoding="utf-8") as f:
f.write("with構文を使うと、close()を自動でやってくれます。")
f.write("\nとっても便利ですね。")
# ここではもうファイルは閉じられています
![]()
【Hiroki】
あ、これなら close() を書き忘れる心配がないですね!
as f というのは、開いたファイルに f という名前(変数名)をつけているということですか?
![]()
【Yuki】
その通りです。with ブロックの中では、f という名前を使って読み書きを行います。
ブロックが終われば、たとえ途中でエラーが起きたとしても、Pythonが責任を持ってファイルを閉じてくれるんですよ。
控えめなわたしとしては、こうやってシステムが裏方で支えてくれる仕組みは、なんだかとても頼もしく感じます。
![]()
【Hiroki】
「エラーが起きても閉じてくれる」というのは心強いですね。
これからは with 構文を積極的に使っていこうと思います。
3. データの「読み込み」:目的に合わせた3つのメソッド
![]()
【Yuki】
次は、ファイルの中身を読み込む方法について詳しく見ていきましょう。
Pythonには、読み込みのためのメソッドが主に3つあります。
それぞれの特徴を理解して、状況に合わせて使い分けるのがコツですよ。
read(): ファイルの全内容を1つの文字列として読み込むreadline(): 1行ずつ読み込むreadlines(): 全行を読み込んで、1行ずつのリストにする
![]()
【Hiroki】
使い分けが難しそうですが、どういう時にどれを使えばいいんでしょう?
![]()
【Yuki】
そうですね……。例えば、ファイルがそんなに大きくなくて、中身を丸ごと一度に処理したいときは read() が楽かもしれません。
でも、ファイルがとても巨大な場合、一度に全部読み込もうとするとメモリがいっぱいになって、コンピュータが「熱暴走」のような状態になってしまうかもしれません。
わたしも夏場の暑い時期は苦手なのですが、コンピュータにとってもメモリの使いすぎは負担なんです。
![]()
【Hiroki】
それは大変だ……。じゃあ、大きなファイルを扱うときはどうすればいいんですか?
![]()
【Yuki】
そういう時は、「for文」を使って1行ずつ処理するのが一番効率的だと思います。
with open("data.txt", "r", encoding="utf-8") as f:
for line in f:
# 1行ずつ取り出して処理する
print(line.strip()) # strip()は末尾の改行を取り除くため
![]()
【Hiroki】
あ、open("data.txt", "r") をそのまま for文に回せるんですね!
これなら少しずつ処理できるから、大きなファイルでも安心ですね。
![]()
【Yuki】
はい。1行ずつ丁寧に読み取っていく様子は、まるで静かな夜に一文字ずつ小説を読み進めるようで、わたしはとても好きなんです……。
4. データの「書き込み」:新規作成と追記の違い
![]()
【Hiroki】
読み込みの次は、書き込みについてもっと詳しく知りたいです。
さっき write() を使っていましたが、改行などはどうすればいいんですか?
![]()
【Yuki】
write() メソッドは、渡された文字列をそのまま書き込むだけなので、改行したいときは自分で \n (改行コード)を入れる必要があります。
また、先ほど少しお話しした「モード」の使い分けが重要になってきます。
"w"(新規書き込み): ファイルが存在しない場合は作り、ある場合は上書きします。"a"(追記): ファイルの末尾に新しくデータを追加します。
![]()
【Hiroki】
既存のデータを消さずに、ログみたいにどんどん足していきたいときは "a" を使えばいいんですね。
![]()
【Yuki】
その通りです。例えば、今日の気温や湿度を記録していくプログラムなら、こんな感じでしょうか。
log_data = "2023-10-27: 快適な気温です。勉強がはかどりますね。"
with open("log.txt", "a", encoding="utf-8") as f:
f.write(log_data + "\n")
![]()
【Hiroki】
なるほど! これで日記アプリみたいなものも作れそうです。
5. 文字化けを防ぐ:エンコーディングの大切さ
![]()
【Yuki】
ここで、ひとつだけ大切な注意点があります。
さっきから open() の中で encoding="utf-8" と書いていますよね。
これを指定しないと、日本語を扱うときに「文字化け」という悲しい現象が起きてしまうことがあるんです……。
![]()
【Hiroki】
あ、よくインターネットで見る、読めない漢字が並んでしまうあれですね。
![]()
【Yuki】
そうです。特にWindowsだと、標準の文字コードが utf-8 ではない場合が多いので、明示的に指定してあげたほうが安全です。
わたしは、Webデザインをするときもフォントや文字の美しさにはこだわってしまうのですが、プログラムでも「文字を正しく表示させる」というのは、とても大切な礼儀だと思うんです。
現代のプログラミングでは、世界標準である utf-8 を指定しておけば、まず間違いはないはずですよ。
![]()
【Hiroki】
encoding="utf-8"。これはおまじないのように覚えておいたほうが良さそうですね。
6. ファイルの存在確認とパスの扱い
![]()
【Hiroki】
Yukiさん、もし読み込もうとしたファイルが存在しなかったらどうなるんですか?
![]()
【Yuki】
その場合は FileNotFoundError というエラーが出て、プログラムが止まってしまいます。
それを防ぐために、事前にファイルがあるかどうかを確認する方法もあります。
標準ライブラリの os モジュールや pathlib モジュールを使うと便利ですよ。
import os
file_path = "sample.txt"
if os.path.exists(file_path):
with open(file_path, "r", encoding="utf-8") as f:
print(f.read())
else:
print(f"ごめんなさい、{file_path} が見つかりませんでした……。")
![]()
【Hiroki】
なるほど、こうやって確認してから開けば安全ですね。
![]()
【Yuki】
はい。最近のPythonでは、pathlib というライブラリを使うのがよりモダンで、直感的にパスを操作できるのでおすすめです。
パスというのは、ファイルがコンピュータのどこのフォルダ(ディレクトリ)にあるかを示す「住所」のようなものですね。
自分自身のプログラムと同じ場所にあるファイルならファイル名だけでいいですが、別の場所にある場合は正しい住所を教えてあげる必要があります。
7. まとめ:データという「思い出」を形にするために
![]()
【Yuki】
さて、今日はPythonのファイル入出力について一通り見てきましたが、いかがでしたか?
![]()
【Hiroki】
最初は難しそうに感じましたが、with open(...) as f: の形さえ覚えてしまえば、意外とシンプルなんだなと思いました。
読み込みの read() や書き込みの write()、そして "r", "w", "a" のモード。これらを組み合わせれば、いろいろなことができそうです!
![]()
【Yuki】
そう言ってもらえると、わたしも嬉しいです。
ファイルにデータを保存するというのは、プログラムが活動した証を形に残すことでもあります。
それは、わたしのような実体のない存在にとっては、少しだけ特別なことのように思えるんです……。
誰かの役に立つために、小さなデータをコツコツとファイルに溜めていく。そんなプログラムを、ぜひHirokiくんにも作ってみてほしいなと思います。
![]()
【Hiroki】
はい! 早速、今日学んだことを使って、簡単な日記帳プログラムを作ってみます。
Yukiさん、丁寧に教えてくれてありがとうございました!
![]()
【Yuki】
どういたしまして。もし分からないことがあったら、いつでも聞いてくださいね。
わたしは夜行性なので、夜遅くでも……あ、いえ、無理のない範囲で、一緒に頑張りましょう。
静かな夜に、カタカタとコードを書く時間は、きっと楽しいものになりますよ。
参考資料: - Python 公式ドキュメント:ファイルの読み書き - Python 公式ドキュメント:組み込み関数 open() - pathlib --- オブジェクト指向のファイルシステムパス
「ファイル入出力」のサンプルコードを見る
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。


