Home‎ > ‎Ruby 関連‎ > ‎

File の読み書き

ここには、Ruby での File の扱いについて、いくつかメモしておく。

ファイルを開いて、その内容を読み込んだり、書き込んだりするには、File.open もしくは単に、open を使う。
option を指定して、開き方を決める。option に何も指定しないと読み込みモードになる。
あと、ファイルは、開けたら close で閉じる。

File.open(file name,option)
open(file name,option)

r: 既存のファイルを読み込み専用で
r+: 既存のファイルを読み書き両用で
w: 新規のファイルを書き込み専用で
w+: 新規のファイルを読み書き両用で
a: 新規/既存のファイルを追加書き込み専用で
a+: 新規/既存のファイルを追加書き込み/読み込み両用で


使い方は、ファイルオブジェクトを作って、中身にアクセスした後閉じるか、ブロックで使う。

次の例は、スクリプトがあるディレクトリの text.txt というファイルを開く方法。

file = File.open("text.txt","r")
  処理
file.close

にするか

File.open("text.txt","r") do |file|
  処理
end


のようにブロックにする。

ここで、ファイルを開いている間に、read で読み込んだり、write で書き込んだりする。上の例での処理に入れる場合、

file.read

で、ファイルの内容をすべて読み込む。read(byte) で、先頭から byte バイトの文字を読み込む。

content = file.read

のように、content という String オブジェクトを作ってそれを処理していく。

これ以外にも、each を使って改行コード (\n) ごとの固まりで処理していくこともできる。(gets も使える)

file.each do |paragraph|
  処理
end

ただ単に中身のテキストを表示させるだけなら、次のように書ける。

File.open("text.txt","r") do |file|
  file.each do |paragraph|
    print paragraph
  end
end

もしくは

file = File.open("text.txt","r")
  file.each do |paragraph|
    print paragraph
  end
file.close

面倒くさければ、まとめて次のようにも書ける。

File.open("text.txt").each do |paragraph|
  print paragraph
end


ファイルを書き込むには、

file.write("This is the text.")

なので、これを処理のところに入れる。

File.open("text.txt","w") do |file|
  file.write("This is the text.")
end


これで、ファイルの内容の基本的な読み書きはできたはず。


CSV ファイルの読み書き

String オブジェクトで、CSV を作ってもいいが、Ruby には便利な CSV クラスのライブラリがあるので、

require 'csv'

で読み込んで使う。

CSV.open(path,mode[,separator][,EOL char]) を使って csv ファイルの読み書きができる。path はそのままファイルのパス、mode は r が読み込み、w が書き込み。separator は ',' でコンマ、'\t' でタブ。デフォルトでは(何も指定しないと)コンマ区切りになる。EOL char は改行文字。デフォルトでは、CRLF か LF になっている。何も指定しないで使っても普通は問題ないと思う。


で、これをブロックにして使う。読み込むときは、一行ごとに配列で読み込まれ、書き込むときは一行ごとに配列を追加していく形で使う。

CSV.open(filename, 'r') do | reader |
  ここで配列 reader を処理する
end

これは読み込みの例。ary という配列の配列(一行ごとに複数の要素が入っているスプレッドシートみたいなもの)をブロックでひとつずつ取り出して、それを csv に一行ごとに書き込んでいく。

CSV.open(filename, 'w') do | writer |
  ary.each do | item |
    writer << item
  end
end

Comments