💡 この記事でわかること
- ファイル操作とは何か、どんなときに使うのか
File.openのモード(r・w・a)の違い- ブロックを渡して安全にファイルを開く方法
read・each_line・File.foreachでの読み込みと、puts・writeでの書き込みFile.read/File.writeの手軽な書き方と、存在しないファイルへの対処
1. ファイル操作とは?
ファイル操作とは、
👉 プログラムからテキストファイルなどを読み込んだり、書き込んだりすることです。
💡 プログラムの変数はプログラムが終わると消えてしまいますが、ファイルに書き出しておけば、あとから読み直したり、別のプログラムで使ったりできます。ログの記録、設定の保存、CSVデータの読み込みなど、実務でも頻繁に使う操作です。
基本的な流れは「開く → 読み書きする → 閉じる」の3ステップです。
2. ファイルを開く:File.open とモード
ファイルは File.open(ファイル名, モード) で開きます。モードによって「読み込み用」「書き込み用」などが決まります。
"r":読み込み(省略時のデフォルト)。ファイルがないとエラー"w":書き込み。ファイルがなければ新規作成、あれば中身を全部消してから書く"a":追記。ファイルの末尾に書き足す(既存の内容は残る)
👉 "w" は既存の内容を消してしまうので、大事なファイルを指定しないよう注意してください。
3. ブロックを渡して安全に開く
開いたファイルは、使い終わったら close で閉じる必要があります。閉じ忘れを防ぐため、Rubyでは File.open にブロック(do 〜 end)を渡すのが基本です。
File.open("sample.txt", "r") do |f|
content = f.read
puts content
end
# ブロックを抜けると、ファイルは自動で閉じられる💡 File.open(...) do |f| と書くと、ブロックを抜けたときに(途中でエラーが起きても)自動的にファイルが閉じられます。ブロックを使わない場合は、次のように自分で close する必要があります。
f = File.open("sample.txt", "r")
content = f.read
f.close # 閉じ忘れやすいのでブロックを推奨👉 ブロック(do 〜 end)の考え方は、if文・for文・while文の記事でも解説しています
4. ファイルを読み込む
read:全体を1つの文字列で読む
text = File.open("sample.txt", "r") { |f| f.read }
puts texteach_line:1行ずつ処理する
File.open("sample.txt", "r") do |f|
f.each_line do |line|
puts line.chomp # chomp で行末の改行を取り除く
end
end👉 1行ずつ読むので大きなファイルでもメモリに優しく、行単位の処理に向いています。ファイルを開かずに直接1行ずつ処理したいときは、File.foreach がさらに手軽です。
File.foreach("sample.txt") do |line|
puts line.chomp
end
# 開く・閉じるは Ruby が自動でやってくれるreadlines:各行を配列で読む
lines = File.readlines("sample.txt")
p lines # ["1行目\n", "2行目\n", "3行目\n"]
puts lines.size # 3
# 改行を取り除いた配列がほしいときは chomp: true
lines = File.readlines("sample.txt", chomp: true)
p lines # ["1行目", "2行目", "3行目"]👉 読み込んだ各行を扱うのに便利な、配列・ハッシュについての記事はこちら
5. ファイルに書き込む
書き込みは "w" モードで開き、puts または write を使います。
File.open("output.txt", "w") do |f|
f.puts "1行目" # puts は改行を自動で付ける
f.puts "2行目"
f.write "3行目" # write は改行を付けない
end👉 画面表示の puts と同じ感覚で、f.puts は行末に改行を自動で付けてくれます。f.write は改行を付けないので、必要なら自分で \n を書きます。
配列の内容をまとめて書き出したいときは、each と組み合わせます。
names = ["太郎", "花子", "次郎"]
File.open("names.txt", "w") do |f|
names.each do |name|
f.puts name
end
end6. File.read / File.write(いちばん手軽)
👉 「ファイル全体を一気に読む・書く」だけなら、File.open を使わず File.read / File.write の1行で済みます。開く・閉じるはRubyがやってくれます。
# 読み込み(全体を文字列で)
text = File.read("sample.txt")
# 書き込み(上書き)
File.write("output.txt", "保存したい内容\n")7. 追記モード(a)
既存の内容を残したまま末尾に書き足したいときは "a" モードを使います。ログの記録などでよく使います。
File.open("log.txt", "a") do |f|
f.puts "アクセスがありました"
end
# File.write でも mode: "a" で追記できる
File.write("log.txt", "アクセスがありました\n", mode: "a")
# 実行するたびに、log.txt の末尾に1行ずつ追加されていく8. 文字コード(エンコーディング)
Rubyは通常、ファイルをUTF-8として読み書きします。日本語を含むファイルでも、多くの環境ではそのままで問題ありません。
💡 文字化けや Encoding 関連のエラーが出たときは、モードにエンコーディングを付けて明示します。
# "モード:エンコーディング" の形で書く
File.open("sample.txt", "r:utf-8") do |f|
puts f.read
end
# Windowsで作られた Shift_JIS のファイルを読むとき
text = File.read("sjis.txt", encoding: "Shift_JIS")9. 存在しないファイルへの対処(Errno::ENOENT)
"r" モードで存在しないファイルを開こうとすると Errno::ENOENT という例外が発生します。ファイルの有無が不確かな場合は、先にチェックするか、例外処理で対応します。
# 方法1: 事前にチェックする
if File.exist?("data.txt")
puts File.read("data.txt")
else
puts "ファイルが見つかりませんでした"
end
# 方法2: 例外処理で対応する
begin
puts File.read("data.txt")
rescue Errno::ENOENT
puts "ファイルが見つかりませんでした"
end👉 Rubyの例外処理(begin・rescue)についての記事はこちら
10. モードとメソッド 早見表
| モード | 用途 | ファイルがない場合 | 既存の中身 |
|---|---|---|---|
| "r" | 読み込み | エラー | — |
| "w" | 書き込み | 新規作成 | すべて消える |
| "a" | 追記 | 新規作成 | 残る(末尾に追加) |
File.read(名前):ファイル全体を1つの文字列で読むFile.readlines(名前):各行を要素にした配列で読む(chomp: trueで改行除去)File.foreach(名前) { |line| }:1行ずつ順番に読むFile.write(名前, 文字列):文字列を書き込む(mode: "a"で追記)File.exist?(名前):ファイルがあるか(true / false)
11. まとめ
- ファイル操作は「開く → 読み書き → 閉じる」。
File.open(...) do |f|で閉じ忘れを防ぐ - モードはr(読み)・w(書き・上書き)・a(追記)の3つが基本
- 読み込みは
read・each_line・File.foreach・File.readlines - 書き込みは
f.puts(改行あり)/f.write(改行なし) - 全体を一気に扱うなら
File.read/File.writeの1行でOK - 存在しないファイルは
Errno::ENOENT。File.exist?かrescueで対処
👉 まずは File.write("test.txt", "こんにちは\n") で書き込み、次に File.read("test.txt") で読み込む、という往復を試してみましょう。ここまでできれば、簡単なメモアプリやログ記録ツールが作れるようになります。