Rubyのファイル操作とは?File.openでの読み書きを解説

PR Ruby

Rubyのファイル操作とは?File.openでの読み書きを解説

💡 この記事でわかること

  • ファイル操作とは何か、どんなときに使うのか
  • File.open のモード(r・w・a)の違い
  • ブロックを渡して安全にファイルを開く方法
  • readeach_lineFile.foreach での読み込みと、putswrite での書き込み
  • 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 text

each_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
end

6. 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つが基本
  • 読み込みは readeach_lineFile.foreachFile.readlines
  • 書き込みは f.puts(改行あり)/ f.write(改行なし)
  • 全体を一気に扱うなら File.read / File.write の1行でOK
  • 存在しないファイルは Errno::ENOENTFile.exist?rescue で対処

👉 まずは File.write("test.txt", "こんにちは\n") で書き込み、次に File.read("test.txt") で読み込む、という往復を試してみましょう。ここまでできれば、簡単なメモアプリやログ記録ツールが作れるようになります。

-Ruby
-, , , ,