Rubyでツールやアプリケーションを開発していると、ログファイルの中身を調べたり、CSVデータを読み込んで集計したりといった「ファイル操作」を行う場面が訪れることがあります。
Rubyにはファイルを扱うための標準クラス File が用意されており、非常に直感的に記述できるのが特徴です。
適切なメソッドを選ばないと、巨大なファイルを読み込んだ際にメモリ不足でプログラムが停止してしまうリスクもあります。
この記事では、Rubyにおけるファイル読み込みの主要なパターンについて、基本の一括取得から、安全な行単位の処理、そして書き込み方法まで、現場で使えるコード例とともに詳しく解説します。
![]() 執筆者:マヒロ |
|
- OS:Windows 11 / macOS Sequoia
- IDE:Visual Studio / VS Code / IntelliJ IDEA
- その他:Chrome DevTools / 各言語最新安定版
※本メディアでは、上記環境にてコードの動作と情報の正確性を検証済みです。
ファイルの中身を「一括」で読み込む File.read
テキストファイルの内容を、ひとつの長い文字列としてまとめて取得したい場合は、File.read メソッドを使用するのが最も簡単です。
設定ファイルや、それほど大きくないテキストデータを扱う場合に適しています。
基本的な使い方
# 読み込むファイル (sample.txt) があると仮定します
# 中身:
# Hello
# Ruby
# World
# ファイルパスを指定して読み込む
content = File.read("sample.txt")
puts content
実行結果
Hello
Ruby
World
File.read("ファイルパス") と記述するだけで、ファイルの中身をすべて読み込み、文字列(String)として返します。
ファイルを開いて(open)、読み込んで(read)、閉じる(close)という一連の処理をこのメソッド一つで自動的に行ってくれるため、非常にコードがシンプルになります。
ただし、数GBもあるような巨大なファイルを読み込むと、メモリを一気に消費してしまうため注意が必要です。
ファイルを「配列」として読み込む File.readlines
ファイルの中身を、1行ごとに分割された「配列(Array)」として取得したい場合は、File.readlines メソッドを使用します。
行ごとにデータが分かれている場合や、インデックスを指定して特定の行だけ取り出したい場合に便利です。
配列として取得するコード
# 配列として一括読み込み
lines = File.readlines("sample.txt")
p lines
puts "---"
puts "1行目: #{lines[0]}"
実行結果
["Hello\n", "Ruby\n", "World\n"]
---
1行目: Hello
File.readlines は、ファイルの各行を要素とする配列を返します。
注意点として、各要素の末尾には改行コード(\n)が含まれたままになっています。
もし改行コードが不要な場合は、chomp オプションを指定するか、取得後に map(&:chomp) などで削除する処理が必要です。
# chomp: true オプションで改行コードを削除して読み込む
lines = File.readlines("sample.txt", chomp: true)
p lines
# => ["Hello", "Ruby", "World"]
メモリに優しく「1行ずつ」処理する File.foreach
ログファイルのような巨大なデータを扱う場合、一括で読み込むとメモリがパンクしてしまいます。
そんな時は、File.foreach を使って、1行読み込んでは処理し、メモリから破棄するというストリーム処理を行います。
1行ずつ順番に処理する
# 1行ずつ読み込んでブロック内で処理する
File.foreach("sample.txt") do |line|
# line には1行分の文字列が入る
puts "読み込み中: #{line.chomp}"
end
実行結果
読み込み中: Hello
読み込み中: Ruby
読み込み中: World
File.foreach はファイルを一行ずつ読み込み、その都度ブロック(do ... end)内の処理を実行します。
一度にファイル全体をメモリに展開しないため、何百万行もあるような巨大なファイルでも、少ないメモリ消費量で安定して処理することができます。
実務でのデータ処理バッチなどでは、この方法が最も推奨されます。
File.open を使った基本的な読み込み
ここまで紹介した便利メソッド(read, readlines, foreach)は、内部的に File.open を使用しています。
より細かい制御をしたい場合や、読み込みと書き込みを同時に行いたい場合などは、基本となる File.open を使います。
ブロックを使った安全なファイル操作
# ブロックを使うことで、処理終了後に自動でcloseされる
File.open("sample.txt", "r") do |file|
# ファイルオブジェクトから読み込む
file.each_line do |line|
puts line.chomp
end
end
File.open("ファイル名", "モード") でファイルを開きます。
モードの "r" は「読み込み専用(Read)」を意味します。
ブロック do |file| ... end を使うことで、ブロックを抜けたタイミングで自動的に file.close が実行されます。
open して close を忘れると、ファイルを開きっぱなしにしてしまいエラーの原因になるため、基本的にはこのブロック記法を使います。
【応用】ファイルへの「書き込み」方法(File.write)
読み込みとセットで覚えておきたいのが、ファイルへの書き込みです。
簡単な書き込みであれば、File.write メソッドが便利です。
テキストファイルを作成・上書きする
text = "新しい内容です。\n上書きされます。"
# ファイルに書き込む(存在しない場合は作成、ある場合は上書き)
File.write("output.txt", text)
# 追記したい場合(モードを 'a' (append) にする)
File.write("output.txt", "\n追記しました。", mode: "a")
File.write は、指定したファイルに文字列を書き込みます。
デフォルトでは上書きとなり、元の内容は消えてしまうので注意してください。
既存のファイルの内容を残したまま、末尾に追加したい場合は、オプションで mode: "a"(追記モード)を指定します。
ファイルが存在しない場合のエラー処理
指定したファイルが見つからない場合、プログラムは Errno::ENOENT という例外を発生させて停止します。
予期せぬ停止を防ぐために、事前にファイルの存在チェックを行うか、例外処理を組み込むのが良いでしょう。
File.exist? で存在確認をする
file_path = "nothing.txt"
if File.exist?(file_path)
puts File.read(file_path)
else
puts "エラー: ファイルが見つかりません。"
end
File.exist?("パス") メソッドは、ファイルが存在すれば true、なければ false を返します。
読み込み処理を行う前にこのチェックを入れることで、安全にプログラムを動かすことができます。
Rubyのスキルを活かして年収を上げる方法
以上、Rubyでファイルを読み込む方法について解説してきました。
Rubyエンジニアの年収や単価は高い傾向にあるため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。
なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。
| 年収アップにこだわりたい方 (平均アップ額138万円の実績) | テックゴー |
| 未経験・経験者問わず幅広く探したい方 | ユニゾンキャリア |
| 業界に精通した担当者に相談したい方 | キッカケエージェント |
| ゲーム業界への転職を志望する方 | ファミキャリ |
| エンジニア未経験からキャリアを築く方 | イーチキャリア |



