【Ruby】レッスン5-08:ファイル操作を理解しよう

一つ前のページではクラスの継承について学習しました。
今回は ファイル操作 について見ていきましょう。
Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:メソッド編
Lesson4:コレクション編
Lesson5:オブジェクト指向編
・Lesson5-1:クラスの基本を理解しよう
・Lesson5-2:イニシャライザを理解しよう
・Lesson5-3:アクセスメソッドを理解しよう
・Lesson5-4:クラス変数とクラスメソッドを理解しよう
・Lesson5-5:privateメソッドを理解しよう
・Lesson5-6:正規表現を理解しよう
・Lesson5-7:クラスの継承を理解しよう
・Lesson5-8:ファイル操作を理解しよう ◁今回はココ
・Lesson5-9:オーバーライドを理解しよう
・Lesson5-10:モジュールを使ってみよう
・Lesson5-11:ミックスインを使ってみよう
・確認問題5-☆1:モンスター捕獲ゲームを作ろう
・確認問題5-☆2:モンスターとの戦闘ゲームを作ろう
・確認問題5-☆3:マルバツゲームを作ろう
Rubyのファイル読み書き処理を基礎から学ぼう

ファイル操作は、プログラムがデータを永続的に保存したり、外部データを読み込んだりする際に必要不可欠な技術です。
Rubyでは簡潔かつ柔軟にファイル操作を行うことができます。
本節ではファイルの読み書きに関する基本的な方法を学びましょう。
ファイル処理の流れと基本操作を理解しよう
Rubyでファイル操作を行うには、主にFile
クラスとopen
メソッドを使用します。
ファイルを開くにはopen
メソッドを使用し、その後に内容を読み取ったり書き込んだりします。
処理が終わった後は必ずファイルを閉じることが重要です(close
メソッドを使用します)。
以下に基本的な例を示します。
# ファイルを開いて閉じる file = File.open("example.txt", "r") # 読み込みモードで開く puts file.read # ファイル内容を読み込んで表示 file.close # ファイルを閉じる
ファイルを読み込む方法と注意点
ファイルを読み込む際の最も基本的な方法はFile.open
メソッドを使用してファイルを開き、read
メソッドで内容を取得することです。
またeach_line
メソッドを使用することで、ファイルを行ごとに処理することもできます。
以下はファイル読み込みの実例です。
# ファイルを行ごとに読み込む File.open("example.txt", "r") do |file| file.each_line do |line| puts line # 各行を出力 end end
このコードでは、ブロックを使用してファイルを開くとブロック終了後に自動的にファイルが閉じられるため、明示的にclose
を呼び出す必要がありません。
ファイルにデータを書き込む方法とは?
ファイルにデータを書き込むには、ファイルを”w”モード(書き込みモード)または”a”モード(追記モード)で開きます。
以下はその例です。
# 新しいデータをファイルに書き込む File.open("example.txt", "w") do |file| file.puts "Hello, Ruby!" # ファイルに文字列を書き込む file.puts "Learning file operations." # さらに文字列を追加 end
このコードでは、”w”モードで開いた場合、ファイルの内容が上書きされます。
“a”モードを使用すれば既存の内容を保持したまま末尾にデータを追加できます。
ファイル操作時のエラー処理とその回避策
ファイル操作では、存在しないファイルを開こうとしたり書き込み権限がない場合にエラーが発生することがあります。
これを防ぐために例外処理を活用しましょう。
# ファイル操作のエラー処理 begin file = File.open("nonexistent.txt", "r") puts file.read rescue Errno::ENOENT => e puts "ファイルが見つかりません: #{e.message}" ensure file&.close # ファイルが開かれていれば閉じる end
rescue
節を用いることで、エラーが発生してもプログラムが停止せず、適切なエラーメッセージを出力できます。
まとめ
本節ではRubyにおけるファイル操作の基本を学びました。
ファイルを開く、読み込む、書き込む、そしてエラーを処理する方法を習得したことで、データを操作するスキルが向上したはずです。
練習問題|Rubyでファイル操作を使ってデータを書き込もう

ァイル操作をしっかりと身に着けるため、練習問題に挑戦しましょう。
ファイル書き込み処理の演習課題に挑戦しよう
学生の名前と成績を格納したハッシュを作成し、それをファイルに書き込むプログラムを作成しましょう。
ハッシュのキーには学生の名前、値にはその成績を格納します。
指定したファイルに各学生の名前と成績を書き出し、正しく出力されることを確認しましょう。
さらに書き込み中にエラーが発生した場合は、適切にエラーメッセージを表示してください。
以下の要件に従ってコードを完成させてください。
- ハッシュの作成:
- 学生の名前をキー、成績を値とするハッシュを作成すること。
- 例:
"Alice" => 90, "Bob" => 80, "Charlie" => 85, "David" => 92
- メソッドの定義:
- 引数としてハッシュとファイル名を受け取り、その内容をファイルに書き込むメソッド
write_to_file
を定義すること。
- 引数としてハッシュとファイル名を受け取り、その内容をファイルに書き込むメソッド
- ファイル操作:
File.open
を使用してファイルを開き、ハッシュの内容を1行ずつ書き込むこと。- 書き込むフォーマットは
"名前: 成績"
とすること。
- エラーハンドリング:
- 書き込み中に例外が発生した場合、例外の内容を含めたエラーメッセージを表示すること。
- プログラムの実行:
- 作成したハッシュを
students.txt
ファイルに書き込むこと。
- 作成したハッシュを
ただし、以下のような実行結果となること。
ファイルに書き込みが完了しました。
ファイル「students.txt」の内容:
Alice: 90 Bob: 80 Charlie: 85 David: 92。
【ヒント】自力で解くのが難しい人へ
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
- ヒント1【コードの構成を見る】
-
正解のコードは上から順に以下のような構成となっています。
1:ハッシュstudentsの定義
□ ハッシュにキーとして学生の名前、値として成績を格納
2:メソッドwrite_to_fileの定義
□ 引数にハッシュとファイル名を受け取る
□ beginによる例外処理の開始
□ □ File.openで指定ファイルを「書き込みモード」で開く
□ □ □ eachメソッドでハッシュの内容をループ
□ □ □ □ ファイルに「名前: 成績」の形式で出力
□ □ putsで「ファイルに書き込みが完了しました。」と出力
□ rescueで例外発生時の処理を定義
□ □ putsで「エラー発生時のメッセージ」を出力
3:メソッドwrite_to_fileの呼び出し
□ ハッシュstudentsを”students.txt”ファイルに書き込む
- ヒント2【穴埋め問題にする】
-
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
# 学生の名前と成績を格納するハッシュを定義 students = { "Alice" => 90, "Bob" => 80, "Charlie" => 85, "David" => 92 } # ファイルに書き込むメソッドの定義 def write_to_file(hash, file_name) begin # ファイルを開く(書き込みモード) =begin 【穴埋め問題1】 ここでFile.openを使って指定したファイルを「書き込みモード」で開き、ブロック内で処理を行うコードを書いてください。 =end puts "ファイルに書き込みが完了しました。" rescue => e # 例外が発生した場合のエラーメッセージを表示 =begin 【穴埋め問題2】 ここで例外の内容を含むエラーメッセージを表示するコードを書いてください。 =end end end # studentsハッシュの内容をstudents.txtファイルに書き込む =begin 【穴埋め問題3】 ここでwrite_to_fileメソッドを呼び出し、studentsハッシュを"students.txt"に書き込むコードを書いてください。 =end
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
この問題の解答例と解説
この問題の正解コードとその解説は以下の通りです。
クリックして開いて確認してください。
- 正解コード
-
# 学生の名前と成績を格納するハッシュを定義 students = { "Alice" => 90, "Bob" => 80, "Charlie" => 85, "David" => 92 } # ファイルに書き込むメソッドの定義 def write_to_file(hash, file_name) begin # ファイルを開く(書き込みモード) File.open(file_name, "w") do |file| hash.each do |name, grade| # ハッシュの各キーと値をファイルに書き込む file.puts "#{name}: #{grade}" end end puts "ファイルに書き込みが完了しました。" rescue => e # 例外が発生した場合のエラーメッセージを表示 puts "ファイルの書き込み中にエラーが発生しました: #{e.message}" end end # studentsハッシュの内容をstudents.txtファイルに書き込む write_to_file(students, "students.txt")
- 正解コードの解説
-
コードをブロックごとに分割して解説します。
ハッシュの定義
students = { "Alice" => 90, "Bob" => 80, "Charlie" => 85, "David" => 92 }
〇
students
ハッシュ:- 例えば、
"Alice" => 90
は、Aliceという学生が90点であることを示します。 - Rubyでデータを格納する基本的な方法の1つです。
- キー(ここでは学生の名前)と値(成績)をペアで管理します。
メソッドの定義
def write_to_file(hash, file_name)
〇
def
キーワード:file_name
(データを保存するファイルの名前)- Rubyでメソッドを定義するために使います。
- このメソッドは、2つの引数を受け取ります:
hash
(学生と成績のデータが格納されたハッシュ)
ファイル操作とエラーハンドリング
begin File.open(file_name, "w") do |file| hash.each do |name, grade| file.puts "#{name}: #{grade}" end end puts "ファイルに書き込みが完了しました。" rescue => e puts "ファイルの書き込み中にエラーが発生しました: #{e.message}" end
〇 ファイル操作:
File.open(file_name, "w")
:- ファイルを「書き込みモード」で開きます。
- ファイルが存在しない場合は新しく作成されます。
- ブロック
{ |file| ... }
:- ブロック内でファイル操作を行います。
file.puts
:- ファイルに文字列を1行ずつ書き込みます。
- 例:
"Alice: 90"
〇 ループ処理:
hash.each
:- ハッシュの各キーと値を順に処理します。
- ここでは、
name
に学生の名前、grade
に成績が代入されます。
〇 エラーハンドリング:
begin
とrescue
:
エラーが発生する可能性があるコードをbegin
ブロック内に書きます。
例外が発生した場合はrescue
ブロックが実行されます。e.message
:
発生したエラーの詳細メッセージを取得します。
メソッドの呼び出し
write_to_file(students, "students.txt")
定義した
write_to_file
メソッドを呼び出します。引数として、
students
ハッシュとstudents.txt
(保存先のファイル名)を渡します。 - 例えば、
まとめ
このプログラムでは、Rubyの基本的なファイル操作とエラーハンドリングを学びました。
初心者の方はぜひ異なるデータやファイル名でこのプログラムを試してみてください。
また読み取りモード("r"
)でファイルを読み込むプログラムを作成することで、Rubyのファイル操作をさらに深く理解することができます。
楽しみながら学習を進めましょう!
FAQ|Rubyのファイル操作でよくある疑問
- Q1. Rubyでファイルが存在しない場合にエラーを出さずに読み込むにはどうすればいいですか?
-
ファイルが存在するかを事前に
File.exist?
メソッドで確認することで、存在しないファイルへのアクセスによるエラーを防ぐことができます。条件分岐と組み合わせるのが一般的です。
- Q2. Rubyでファイルに追記するにはどのモードを使えばいいですか?
-
ファイルに追記するには、
"a"
(append)モードを使用します。これにより既存の内容を保持したまま、末尾に新しいデータを追加できます。File.open
と組み合わせて使うのが基本です。
- Q3. ファイル操作で発生しうるエラーにはどんな種類がありますか?
-
代表的なエラーには「ファイルが存在しない」「アクセス権がない」「ディスク容量不足」などがあります。
begin-rescue
を使った例外処理で、各種エラーに対処することが推奨されます。