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

例如,这里有一个方法:

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

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


当前回答

如果文件很小(吸声):

puts File.read("filename.txt")

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

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

其他回答

您可以一次读取所有文件:

content = File.readlines 'file.txt'
content.each_with_index{|line, i| puts "#{i+1}: #{line}"}

当文件很大或可能很大时,通常最好逐行处理:

File.foreach( 'file.txt' ) do |line|
  puts line
end

有时候你想访问文件句柄或者自己控制读取操作:

File.open( 'file.txt' ) do |f|
  loop do
    break if not line = f.gets
    puts "#{f.lineno}: #{line}"
  end
end

对于二进制文件,你可以指定一个空分隔符和块大小,如下所示:

File.open('file.bin', 'rb') do |f|
  loop do
    break if not buf = f.gets(nil, 80)
    puts buf.unpack('H*')
  end
end

最后,您可以在没有块的情况下完成,例如在同时处理多个文件时。在这种情况下,文件必须显式关闭(根据@antinome的评论改进):

begin
  f = File.open 'file.txt'
  while line = f.gets
    puts line
  end
ensure
  f.close
end

参考:文件API和IO API。

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

返回your_file.log或.txt中的最后n行

path = File.join(Rails.root, 'your_folder','your_file.log')

last_100_lines = `tail -n 100 #{path}`

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

puts File.read(file_name)

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

我通常这样做:

open(path_in_string, &:read)

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