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

記事内に商品プロモーションを含む場合があります

この記事で学べる知識:ファイル操作

この記事の練習問題を解くために必要な知識:
基礎文法、制御構造、メソッド、コレクション(レッスン1~4)クラスの定義と使用イニシャライザアクセスメソッドクラス変数とクラスメソッドprivateメソッド正規表現クラスの継承ファイル操作オーバーライドモジュールの定義と使用ミックスイン

<<前のページ Ruby記事一覧 次のページ>>

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におけるファイル操作の基本を学びました。

ファイルを開く、読み込む、書き込む、そしてエラーを処理する方法を習得したことで、データを操作するスキルが向上したはずです。

ファイル操作の練習問題

学生の名前と成績を格納したハッシュを作成し、それをファイルに書き込むプログラムを作成しましょう。

ハッシュのキーには学生の名前、値にはその成績を格納します。

指定したファイルに各学生の名前と成績を書き出し、正しく出力されることを確認しましょう。

さらに書き込み中にエラーが発生した場合は、適切にエラーメッセージを表示してください。

この問題の要件

以下の要件に従ってコードを完成させてください。

  1. ハッシュの作成:
    • 学生の名前をキー、成績を値とするハッシュを作成すること。
    • 例: "Alice" => 90, "Bob" => 80, "Charlie" => 85, "David" => 92
  2. メソッドの定義:
    • 引数としてハッシュとファイル名を受け取り、その内容をファイルに書き込むメソッド write_to_file を定義すること。
  3. ファイル操作:
    • File.open を使用してファイルを開き、ハッシュの内容を1行ずつ書き込むこと。
    • 書き込むフォーマットは "名前: 成績" とすること。
  4. エラーハンドリング:
    • 書き込み中に例外が発生した場合、例外の内容を含めたエラーメッセージを表示すること。
  5. プログラムの実行:
    • 作成したハッシュを 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")

正解コードの解説

今回のコードはRubyを用いて「学生の名前と成績をファイルに保存する」というプログラムです。

ファイル操作の基本的な方法やエラーハンドリングについて学ぶことができます。

コードをブロックごとに分けて解説していきます。

ハッシュの定義

students = {
  "Alice" => 90,
  "Bob" => 80,
  "Charlie" => 85,
  "David" => 92
}
students ハッシュ:
  • Rubyでデータを格納する基本的な方法の1つです。
  • キー(ここでは学生の名前)と値(成績)をペアで管理します。
  • 例えば、"Alice" => 90 は、Aliceという学生が90点であることを示します。

メソッドの定義

def write_to_file(hash, file_name)
def キーワード:
  • Rubyでメソッドを定義するために使います。
  • このメソッドは、2つの引数を受け取ります:
    1. hash(学生と成績のデータが格納されたハッシュ)
    2. 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
〇 ファイル操作:
  1. File.open(file_name, "w"):
    • ファイルを「書き込みモード」で開きます。
    • ファイルが存在しない場合は新しく作成されます。
  2. ブロック { |file| ... }:
    • ブロック内でファイル操作を行います。
    • file.puts:
      • ファイルに文字列を1行ずつ書き込みます。
      • 例: "Alice: 90"
〇 ループ処理:
  1. hash.each:
    • ハッシュの各キーと値を順に処理します。
    • ここでは、name に学生の名前、grade に成績が代入されます。
〇 エラーハンドリング:
  1. beginrescue:
    • エラーが発生する可能性があるコードを begin ブロック内に書きます。
    • 例外が発生した場合は rescue ブロックが実行されます。
    • e.message:
      • 発生したエラーの詳細メッセージを取得します。
    • 例: 「ファイルが存在しない」や「権限がない」などのエラー。

メソッドの呼び出し

write_to_file(students, "students.txt")
  • 定義した write_to_file メソッドを呼び出します。
  • 引数として、students ハッシュと students.txt(保存先のファイル名)を渡します。

まとめ

このプログラムでは、Rubyの基本的なファイル操作とエラーハンドリングを学びました。

初心者の方はぜひ異なるデータやファイル名でこのプログラムを試してみてください。

また読み取りモード("r")でファイルを読み込むプログラムを作成することで、Rubyのファイル操作をさらに深く理解することができます。

楽しみながら学習を進めましょう!

<<前のページ Ruby記事一覧 次のページ>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Rubyテキスト&問題集へ戻る
    トップページへ戻る