Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyでファイルを読み書きする方法を実例つきで徹底解説

Rubyでファイルの読み書きができるようになると、ファイルからデータを抽出したり、新しいファイルを作成したり、必要な情報を素早く見つけたりできるようになります。この記事では、Rubyにおけるファイル操作の基本を、実際のコード例とともにわかりやすく解説します。

この記事で学べること

  • Rubyでファイルを読み込む方法
  • Rubyでファイルに書き込む方法
  • 覚えておきたいFileクラスのメソッド
  • ディレクトリ操作の基礎
  • FileUtilsモジュールの使い方
  • まとめ

それでは始めましょう!

Rubyでファイルを読み込む方法

Rubyでファイルを読み込む基本的な流れは、次の3ステップです。

  1. openメソッドでファイルを開く
  2. readメソッドなどで内容を読み取る(全体・1行ずつ・指定バイト数など)
  3. closeメソッドでファイルを閉じる

それぞれの手順を詳しく見ていきます。

1. Fileクラスでファイルを開く

file = File.open("users.txt")

この時点で得られるのはFileオブジェクトであり、まだファイルの中身そのものではありません。続いて、読み込み方法は主に3つあります。

2. ファイル全体を一括で読み込む

file_data = file.read

# "user1\nuser2\nuser3\n"

複数行のファイルを扱う場合は、file_datasplitで分割するか、readlinesメソッドと改行文字を除去するchompメソッドを組み合わせるのが便利です。

file_data = file.readlines.map(&:chomp)

# ["user1", "user2", "user3"]

3. ファイルを閉じてリソースを解放する

ファイルの操作が終わったら、closeを呼び出してメモリやシステムリソースを解放しましょう。

file.close

open / closeを省略できるショートカット

開く・閉じるを明示的に書きたくない場合は、File.readメソッドが便利です。

file_data = File.read("user.txt").split

# ["user1", "user2", "user3"]

1行ずつ処理する(大きなファイルに最適)

ファイルを1行ずつ処理したい場合は、foreachメソッドを使います。

File.foreach("users.txt") { |line| puts line }

この方法ならファイル全体をメモリに読み込まずに済むため、サイズの大きいファイルを扱うときに特に有効です。

Rubyでファイルに書き込む方法

Rubyでファイルに書き込む手順は以下の通りです。

  1. 書き込みモード("w"フラグ)でファイルを開く
  2. writeメソッドでデータを書き込む
  3. ブロック形式を使わなかった場合は、忘れずにcloseを呼ぶ
File.open("log.txt", "w") { |f| f.write "#{Time.now} - User logged in\n" }

重要な注意点:"w"モードは既存のファイル内容をすべて上書きします。内容を追記したい場合は、"w"(write)ではなく"a"(append:追記)フラグを使用してください。

File.writeで1行だけ書き込む

より簡単な方法として、File.writeが使えます。

File.write("log.txt", "data...")

追記モードで使うには、mode:オプションに"a"を指定します。

File.write("log.txt", "data...", mode: "a")

これが、たった1行のコードでファイルに書き込める最もシンプルな方法です。

配列をファイルに書き込む

配列をそのまま書き込むことはできないため、joinなどで先に文字列へ変換する必要があります。

File.write("log.txt", [1,2,3].join("\n"), mode: "a")

このようにオブジェクトを文字列へ変換することを「シリアライズ」と呼びます。

覚えておきたいFileクラスのメソッド

読み書き以外にも、ファイルに対してはさまざまな操作が可能です。たとえば「ファイルが存在するか確認したい」「現在のディレクトリのファイル一覧を取得したい」といったケースです。

よく使われるメソッドは以下の通りです。

  • rename(名前変更)
  • size(サイズ取得)
  • exist?(存在確認)
  • extname(拡張子取得)
  • basename(ファイル名取得)
  • dirname(ディレクトリ部分のパス取得)
  • directory?(ディレクトリかどうか判定)
  • file?(ファイルかどうか判定)

具体的な使用例を見てみましょう。

# ファイル名を変更する
File.rename("old-name.txt", "new-name.txt")

# ファイルサイズ(バイト単位)
File.size("users.txt")

# ファイルがすでに存在するか確認
File.exist?("log.txt")

# 拡張子を取得(ファイルが存在しなくても動作する)
File.extname("users.txt")
# => ".txt"

# ディレクトリ部分を除いたファイル名を取得
File.basename("/tmp/ebook.pdf")
# => "ebook.pdf"

# ファイル名を除いたパスを取得
File.dirname("/tmp/ebook.pdf")
# => "/tmp"

# それがファイルなのかディレクトリなのかを判定
File.directory?("cats")

補足:exists?は古い書き方で、現在はexist?の使用が推奨されています。

最後のdirectory?は、ディレクトリ内の一覧をループ処理するときに特に役立ちます。

def find_files_in_current_directory
  entries = Dir.entries(".")

  entries.reject { |entry| File.directory?(entry) }
end

また、File.statを使えば、ファイルサイズや権限、作成日時などの詳細情報も取得できます。

File.stat("/tmp")

ディレクトリ操作

Dir.globを使うと、特定のパターンに一致するファイルの一覧を取得できます。

# カレントディレクトリの全ファイル
Dir.glob("*")

# 名前に「spec」を含む全ファイル
Dir.glob("*spec*")

# すべてのRubyファイル
Dir.glob("*.rb")

次の1行で、カレントディレクトリ以下の全ファイルを再帰的に一覧表示できます。

Dir.glob("**/**")

ディレクトリだけを検索したい場合はこちらです。

Dir.glob("**/**/")

Dirクラスでは、その他にも以下のような操作が可能です。

# カレントワーキングディレクトリを表示
Dir.pwd

# ディレクトリが空かどうか確認
Dir.empty?("/tmp")
# false

# ディレクトリが存在するか確認
Dir.exist?("/home/jesus")
# true

# 新しいディレクトリを作成
Dir.mkdir("/tmp/testing")

# 一時ディレクトリを作成(mktmpdir)
require 'tmpdir'
Dir.mktmpdir do |dir|
  File.write(dir + "/log.txt", "test")
end

FileUtilsモジュールの使い方

FileUtilsモジュールを利用すると、さらに便利なファイル操作ユーティリティが使えるようになります。たとえば、ファイル同士の比較、touchによる最終アクセス日時・更新日時の更新cp_rによるファイルやディレクトリの再帰コピーなどです。

require 'fileutils'

FileUtils.compare_file("a.txt", "b.txt")
FileUtils.touch("/tmp/lock")
FileUtils.cp_r("data", "backup")

ちなみに、cp_rの「r」は「recursive(再帰的)」を意味しています。

まとめ

この記事では、File.readFile.writeといった組み込みメソッドを使って、Rubyでファイルやフォルダを管理する方法を学びました。基本の読み書きから、ディレクトリ操作、FileUtilsによる応用的な操作まで、日常の開発で役立つテクニックばかりです。ぜひ実際のコードで試してみてください。


  1. Rubyのmapメソッド完全ガイド!配列・ハッシュのデータ変換を実例で解説

    Rubyのmapメソッドは、配列(Array)・ハッシュ(Hash)・範囲(Range)といったコレクションに対して使用できる強力なメソッドです。 mapの主な用途は、データの変換です。 例えば、文字列の配列があった場合、すべての文字列を順番に処理して、各文字を大文字に変換することができます。 また、Userオブジェクトのリストがある場合も同様です。 それらを変換して、対応するメールアドレスや電話番号など、Userクラスに定義された任意の属性のリストを作成できます。 それでは、具体的な使い方を見ていきましょう! Ruby mapメソッドの基本構文 mapの構文は次のようになっています。 a

  2. Windows 10でメモリダンプファイル(.dmp)を読み取る方法|BlueScreenViewとWinDbgの使い方

    PCが突然クラッシュした経験はありませんか?その際に表示されるのが、いわゆる「ブルースクリーン(BSOD)」です。BSODにはクラッシュの原因が一瞬表示されますが、数秒で画面が消えてしまうため、その場で原因を分析することはほぼ不可能です。幸いなことに、Windowsがクラッシュすると、シャットダウンの直前にクラッシュに関する情報を記録した「クラッシュダンプファイル(.dmp)」や「メモリダンプ」が自動的に作成されます。このダンプファイルを解析することで、エラーの原因を特定し、トラブルシューティングにつなげることができます。メモリダンプファイルとは?BSODが表示されると同時に、Windowsは