Ruby 读取文件
最后修改于 2023 年 10 月 18 日
本文介绍如何在 Ruby 语言中读取文件。我们读取文本文件和二进制文件。ZetCode 还有一个简洁的 Ruby 教程。
Ruby 有 File
和 IO
类来处理文件。
stones.txt
Garnet Topaz Opal Amethyst Ruby Jasper Pyrite Malachite Quartz
这是 stones.txt
文件。
Ruby 将文件读取到字符串
File.read
方法将整个文件读取到一个字符串中。由于此方法将整个内容读入内存,因此它只适用于较小的文件。File.read
在返回之前会确保文件被关闭。
read_into_string.rb
#!/usr/bin/ruby fname = 'stones.txt' content = File.read(fname) p content puts content
该示例将 stones.txt
读取到一个字符串中。
$ ./read_into_string.rb Garnet Topaz Opal Amethyst Ruby Jasper Pyrite Malachite Quartz "Garnet\nTopaz\nOpal\nAmethyst\nRuby\nJasper\nPyrite\nMalachite\nQuartz"
这是输出。
Ruby 使用 File.foreach 读取文件
File.foreach
会打开一个文件,然后为读取到的每一行调用给定的块,最后关闭文件。这是 Ruby 中读取文件的一种有效且非常简单的方法。它可以用于大文件。
foreach_fun.rb
#!/usr/bin/ruby fname = 'stones.txt' File.foreach(fname) { |line| puts line }
在示例中,我们逐行读取 stones.txt
文件。
Ruby 使用 File.readlines 将文件读取到数组
File.readlines
方法将整个文件读取到一个由行组成的数组中。该方法会自动为我们关闭文件。由于该方法一次性读取整个文件,因此它适用于较小的文件。
read_lines.rb
#!/usr/bin/ruby fname = 'stones.txt' lines = File.readlines(fname) puts lines p lines
该示例将 stones.txt
文件的内容读取到一个数组中。
$ ./read_lines.rb Garnet Topaz Opal Amethyst Ruby Jasper Pyrite Malachite Quartz ["Garnet\n", "Topaz\n", "Opal\n", "Amethyst\n", "Ruby\n", "Jasper\n", "Pyrite\n", "Malachite\n", "Quartz"]
这是输出。
Ruby 使用 File.binread 读取二进制文件
File.binread
方法读取二进制文件。它会在返回前关闭文件。
read_binary.rb
#!/usr/bin/ruby fname = 'favicon.ico' data = File.binread(fname) data2 = data.unpack('H*')[0] i = 0 data3 = data2.scan /.{1,2}/ data3.each do |e| print "#{e} " i += 1 if i % 15 == 0 then puts end end puts
在示例中,我们使用 File.binread
读取了一个小型图像。我们使用 unpack
将数据转换为十六进制值。然后,我们将十六进制值以十五列(每列两个十六进制值)的形式输出。
$ ./read_binary.rb 00 00 01 00 01 00 10 10 00 00 00 00 00 00 68 05 00 00 16 00 00 00 28 00 00 00 10 00 00 00 20 00 00 00 01 00 08 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 ff ff ff 00 4d 45 3d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...
在本文中,我们展示了如何在 Ruby 语言中读取文件。