在Ruby中读取文件的常见方法有哪些?

例如,这里有一个方法:

fileObj = File.new($fileName, "r")
while (line = fileObj.gets)
  puts(line)
end
fileObj.close

我知道Ruby非常灵活。每种方法的优点/缺点是什么?


当前回答

我通常这样做:

open(path_in_string, &:read)

这将为您提供整个文本作为字符串对象。它只能在Ruby 1.9下工作。

其他回答

如果文件很小(吸声):

puts File.read("filename.txt")

如果文件很大(流媒体):

File.foreach("filename.txt") { |line| puts line }

如果文件不是太长,最简单的方法是:

puts File.read(file_name)

事实上,IO。读取或文件。读取后自动关闭文件,因此不需要使用file。用木块打开。

File.open("my/file/path", "r") do |f|
  f.each_line do |line|
    puts line
  end
end
# File is closed automatically at end of block

也可以像上面那样显式地关闭文件(传递一个块来打开并为你关闭它):

f = File.open("my/file/path", "r")
f.each_line do |line|
  puts line
end
f.close

小心“吮吸”文件。这是指将整个文件一次性读入内存。

问题是它的可扩展性不好。您可能正在使用一个大小合理的文件开发代码,然后将其投入生产,突然发现您正在尝试读取以gb为单位的文件,并且您的主机在尝试读取和分配内存时死机了。

一行一行的I/O非常快,几乎总是像吮吸一样有效。实际上它的速度快得惊人。

我喜欢用:

IO.foreach("testfile") { |x| print "GOT ", x }

or

File.foreach('testfile') { |x| print "GOT", x }

File继承自IO, foreach在IO中,所以你可以使用任何一个。

我在“https://stackoverflow.com/q/25189262/128421”上有一些基准测试,显示了通过read和逐行I/O读取大文件的影响。

一个简单的方法是使用readlines:

my_array = IO.readlines('filename.txt')

输入文件中的每一行都是数组中的一个条目。该方法为您处理打开和关闭文件的操作。