要点
- Fileクラスを使うことで、開いたファイルをオブジェクトとして扱える
- Fileはopenメソッドで開き、closeメソッドで閉じる
- openメソッドで開いたファイルオブジェクトに対して、行単位の読み込みなどの処理を行う
ファイルのオープン/クローズ
ファイルのオープンにはFile#open
メソッドを使う。第1引数でファイルのパス、第2引数でファイルを開くモードを文字列で指定。
変数 = File.open("ファイルへのパス", "モード")
モード指定の例は以下の通り。
"r" |
読込 | デフォルト |
"w" |
書込 | ファイルが存在している場合は内容を空にする |
"a" |
追加 | ファイルが存在している場合は末尾に追加する |
"r+" |
読書 | ポインターはファイルの先頭にセット |
"w+" |
読書 | ファイルが存在している場合は内容を空にする |
"a+" |
読書 | 読込位置は先頭、書き込み位置は末尾にセット |
ファイルのクローズにはclose
メソッドを使う。
ファイルオブジェクトの変数.close
以下はファイル名を指定してファイルを開き、何もせずにクローズする例。
1 2 3 4 5 |
file = File.open("read_file.txt", "r") # file operations file.close |
以下の構文は、ファイルのクローズを明示しなくても完結する。
1 2 3 4 5 |
File.open("read_file.txt", "r") do |file| # file operations end |
ただしこれには注意が必要。このブロックの中で定義した変数でファイルの内容を読み込むと、ブロックの外ではその変数は使えない(ブロック内スコープ)。
ブロック内で読んだ内容を外で参照するためには、ブロック外で変数が定義されている必要がある。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
text = "" # ブロック外での変数定義が必要 File.open("read_file.txt", "r") do |file| text = file.read end puts(text) # ABCDEFGHIJKLMNOP # BCDEFGHJIKLMNOPQ # CDEFGHIJKLMNOPQR # DEFGHIJKLMNOPQRS |
ファイルの読み込み
一括読込
ファイルの読み込みは、ファイルオブジェクトのread
メソッドを使う。
1 2 3 4 5 6 7 8 9 10 |
file = File.open("read_file.txt", "r") text = file.read file.close puts(text) # ABCDEFGHIJKLMNOP # BCDEFGHJIKLMNOPQ # CDEFGHIJKLMNOPQR # DEFGHIJKLMNOPQRS |
行ごとの読み込み
File
オブジェクトのeach_line
メソッドを使うと、行単位で読み込んでくれる。
1 2 3 4 5 6 7 8 9 10 11 12 |
file = File.open("read_file.txt", "r") file.each_line do |line| puts(line) end file.close # ABCDEFGHIJKLMNOP # BCDEFGHJIKLMNOPQ # CDEFGHIJKLMNOPQR # DEFGHIJKLMNOPQRS |
行番号
File
オブジェクトのlineno
プロパティーは、現在読んでいる位置の行番号を持っている。
1 2 3 4 5 6 7 8 9 10 11 12 |
file = File.open("read_file.txt", "r") file.each_line do |line| puts("#{file.lineno}:#{line}") end file.close # 1:ABCDEFGHIJKLMNOP # 2:BCDEFGHJIKLMNOPQ # 3:CDEFGHIJKLMNOPQR # 4:DEFGHIJKLMNOPQRS |
ファイルの書き込み
ファイルの書き込みはopen
の第2引数で"w"
を指定する。ファイルが存在すればその内容が空にされ、ファイルが存在しなければ新たに作られる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
file = File.open("write_file.txt", "w") line = "" for n in 1..100 line += "#{n} " if n % 10 == 0 file.puts(line) line = "" end end file.close # write_file.txtの内容 # 1 2 3 4 5 6 7 8 9 10 # 11 12 13 14 15 16 17 18 19 20 # 21 22 23 24 25 26 27 28 29 30 # 31 32 33 34 35 36 37 38 39 40 # 41 42 43 44 45 46 47 48 49 50 # 51 52 53 54 55 56 57 58 59 60 # 61 62 63 64 65 66 67 68 69 70 # 71 72 73 74 75 76 77 78 79 80 # 81 82 83 84 85 86 87 88 89 90 # 91 92 93 94 95 96 97 98 99 100 |