- お知らせ -
  • 当wikiのプログラムコードの表示を直してみました(ついでに長い行があると全体が下にぶっ飛ぶのも修正)。不具合があればBBSまでご連絡下さい。

Ruby

はじめに Edit

Rubyでの簡単!ファイルアクセスの方法を解説。
ruby 1.8.7,一部1.9.2にて確認

一発でテキストファイルを読む方法 Edit

1.9.2でFile.read(IO.read)を使う場合、

s = File.read("hoge.txt", :encoding => Encoding::UTF_8)

ruby 1.9では読み込むテキストの文字コード(:encoding)をなるべく明示することに注意。文字コードが異なる場合は、encodeでそのまま変換するのがいいと思います。
※ File.readの:encodingを指定しないと、encodeで文字化けすることになるかと思います

s = File.read("hoge.txt", :encoding => Encoding::EUC_JP).encode(Encoding::UTF_8)

ファイルパスの扱い(相対パスの展開など)を考えると、Pathname#readを使うのも便利です。

require 'pathname'
s = Pathname("~/hoge/foobar.txt").expand_path.read(:encoding => Encoding::UTF_8))

1.8.7ではFile.read(IO.read)でも、

s = File.read("hoge.txt")

よいようです(IO.readでも可)

※ ちなみに、

s = open("hoge.txt").read

でも、行けそうですが、不安定なので、推奨されないらしい
どうしても、openでやりたければ、

s = open("bush.txt") {|f| f.read}

で。

一発でテキストを書き込む方法 Edit

ruby 1.9.3 ではFile.write(IO.write)とFile.binwrite(IO.binwrite)ができ、簡単にファイルに文字列を書き込めるようです!!!!!!! (参考: Ruby 1.9 - Feature #1081: add File::write() convenience method - Ruby Issue Tracking System)

s = "foo bar"
File.write("hoge.txt", s)

1.9.2, 1.8.7では、File.writeやFile.binwriteがないようなので、

s = "hogehoge"
open("hoge.txt", "w") {|f| f.write s}

これで。

バイナリを読む場合 Edit

File.readやIO.readだとバイナリは読めません。

Ruby 1.9では File.binread(IO.read) を使うのが手っ取り早いと思います。

binary = File.binread("hoge.dat")

ファイルパスの扱い(相対パスを展開したいなど)を考えると、Pathname#binreadを使うのも便利です。

require 'pathname'
binary = Pathname("~/tmp/hoge.dat").expand_path.binread

Ruby 1.8だとbinreadがないようなので、File.openするときに"rb"でバイナリの指定をします。

s = File.open("mage", "rb") {|f| f.read }

バイナリを書く場合 Edit

ruby 1.9.3では、File.binwriteが使えるようになった ようです。

s = "hogehoge"
File.binwrite("hoge.txt", s)

ruby 1.9.2や1.8.7では、"wb"のバイナリモードで書き込むとOK。

s = "hogehoge"
File.open("hoge.txt", "wb") {|f| f.write s}

改行の変更(CRLF→LF)等はバイナリモードで書きこまないと、
反映されませんでした。

一行ずつテキストを読み込む方法 Edit

foreachを使った最も手っ取り早い方法 Edit

1
2
3
IO.foreach("log.txt") do |s|
  puts s
end

each(each_line)を使った方法 Edit

IOオブジェクトが取得できていれば、これでOK

1
2
3
4
5
open("log.txt") do |file|
  file.each do |s|
    puts s
  end
end

  • File.readlinesは? -- hoge? 2012-07-26 (Thu) 17:30:56


Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New Pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2012-07-26 Thu 17:30:57 JST (1882d)