Rubyでファイルの書き込みを行いたい場合、writメソッドを利用することが可能です。
本記事では、ファイル操作の中でも書き込み処理に焦点を当て、サンプルコードを掲載しながら解説していきたいと思います。
目次
Fileクラスのwriteメソッドとは
RubyのFileクラスにはwriteメソッドが用意されており、ファイルへの書き込み処理を実施したい場合に利用します。
クラスメソッドとして利用する方法と、インスタンスメソッドとして利用する方法の2種類の方法が選択出来ます。
クラスメソッドでの利用法
Fileクラスから直接writeメソッドを利用する場合、下記のように記述出来ます。
File.write(ファイルパス, 書き込む内容)
「sample.txt」というファイルに「テスト」と書き込む場合は下記のように記述します。
File.write("sample.txt", "テスト")
インスタンスメソッドでの利用法
インスタンスを生成してwriteメソッドを利用する場合、まずFile.openメソッドでファイルを開き、読み書きモードを設定した上で使用します。
インスタンス名 = File.open(ファイルパス, 読み書きモード) インスタンス名.write(書き込む内容) インスタンス名.close
クラスメソッドのサンプルをインスタンス生成での利用法に書き換えると、下記のようになります。
file = File.open("sample.txt", "w") file.write("テスト") file.close
「file」という名前のインスタンスを作成し、writeメソッドを呼び出した上で引数に書き込む内容を指定します。
クラスメソッドでFile.writeを使ってみよう
単純にファイルに何かを記述したいだけであれば、インスタンスを生成しないFile.writeメソッドで手っ取り早く実装出来てしまいます。
モードを指定した書き込み処理
上記サンプルで通常の書き込み処理に関しては紹介しているので、今回は追記の方法を確認してみましょう。
インスタンスを生成した書き込みを行う際、指定した読み書きモードの「a」にあたる追記処理がクラスメソッドのwriteメソッドでも実は利用することが出来ます。
File.write("sample.txt", "追記します", mode: "a")
実行結果
テスト追記します
第3引数としてmodeに「a」 を指定することで、追記モードとしてファイルに書き込みを行うことが可能です。
配列を定義してファイルに書き込む
1度に複数の文字列をファイルに書き込みたい場合には、下記のような記述も可能です。
今回は結果を分かりやすくするため、書き込みモード(mode: “w”)に切り替えた上で実行してみましょう。
File.write("sample.txt", ["a", "b", "c"].join("\n"), mode: "w")
実行結果
a b c
サンプルでは、配列で定義した文字列をjoinメソッドにより1つの文字列のまとまりとした上で、ファイルへの書き込みを実施しています。
インスタンスメソッドでwriteメソッドを使ってみよう
ではインスタンスメソッドでwriteメソッドを使用する方法についても確認しておきましょう。
インスタンスを生成してファイルの書き込みを行う場合、ファイルを開く際に読み書きモードを指定する必要があります。
書き込みモード(w, w+)
まず書き込みモードでファイルを開いた場合、ファイルが存在する場合は全ての内容が削除されて指定した内容が書き込まれます。
ファイルが存在しない場合には、新規ファイルとして作成された上で指定した内容が書き込まれます。
サンプル
上記で利用している「sample.txt」ファイルに書き込み処理を実施してみましょう。
file = File.open("sample.txt", "w") file.write("サンプル1") file.write("サンプル2") file.close
実行結果
サンプル1サンプル2
このようにwriteメソッドでは書き込み処理を連続して行った場合、改行は実施されませんので注意が必要です。
w+を指定した場合には読み込み処理も実施出来ます。
追記モード(a, a+)
追記モードでファイルを開いた場合、ファイルが存在する場合は、ファイル末尾から指定した内容を追記する形で書き込みが実施されます。
ファイルが存在しない場合には、上述した「w」と同じく、新規ファイルとして作成された上で指定した内容が書き込まれます。
サンプル
同じ「sample.txt」ファイルに今度は追記モードで書き込み処理を実施してみます。
file = File.open("sample.txt", "a") file.write("サンプル3") file.write("サンプル4") file.close
実行結果
サンプル1サンプル2サンプル3サンプル4
a+を指定した場合には、w+同様に読み込み処理も実施出来ます。
上書きモード(r+)
上書きモードでファイルを開いた場合、ファイルが存在する場合はデフォルトで、ファイル先頭から上書きする形で書き込みが実施されます。
オプションで開始位置を指定することも可能です。
ファイルが存在しない場合には、エラーとなってしまうため注意が必要です。
開始位置を指定しないサンプル
「sample.txt」に上書きモードで書き込み処理を実施してみます。
file = File.open("sample.txt", "r+") file.write("サンプル5") file.close
実行結果
サンプル5サンプル2サンプル3サンプル4
ファイル先頭から上書きされたため、「ファイル1」と記述されていた内容が「ファイル5」に書き換わっています。
開始位置を指定したサンプル
続いて開始位置を指定して任意の位置から上書きしてみます。
開始位置を変更するには「seek」メソッドを利用することが可能で、第1引数にバイト数、第2引数に基準の位置を指定します。
- IO::SEEK_SET(ファイルの先頭から)
- IO::SEEK_CUR(カーソルの位置から)
- IO::SEEK_END(ファイル末尾から)
マルチバイトである日本語の場合、サンプルが分かりにくくなるためファイルの内容を下記のように変更しておきます。
sample1sample2
今回は「sample1」の記述を「sample3」に書き換えてみましょう。
file = File.open("sample.txt", "r+") file.seek(6, IO::SEEK_SET) file.write("3") file.close
実行結果
sample3sample2
第1引数に「6」と指定したことで、7バイト目から上書きが実行されるため、結果的に「sample1」が「sample3」に修正されています。
さいごに: Rubyファイル操作の基本 Fileクラスのwriteメソッドを使ってみよう!
本記事では、Rubyでのファイル操作処理に欠かせないFileクラスから提供されるwriteメソッドの使い方についてご紹介してきました。
今回ご紹介した内容は基本的な部分であり、クラスメソッド・インスタンスメソッドどちらを利用するかは実装するプログラムにより異なります。
数多くのサンプルプログラムに触れて、各メソッドがどういった場面で利用されているのか意識してみてください。
joinメソッドでは引数に区切り文字を設定することが可能で、サンプルでは改行文字(“\n”)を設定しているため出力されたデータが要素毎に改行されています。