在Ruby中读取文件的常见方法有哪些?
例如,这里有一个方法:
fileObj = File.new($fileName, "r")
while (line = fileObj.gets)
puts(line)
end
fileObj.close
我知道Ruby非常灵活。每种方法的优点/缺点是什么?
在Ruby中读取文件的常见方法有哪些?
例如,这里有一个方法:
fileObj = File.new($fileName, "r")
while (line = fileObj.gets)
puts(line)
end
fileObj.close
我知道Ruby非常灵活。每种方法的优点/缺点是什么?
当前回答
返回your_file.log或.txt中的最后n行
path = File.join(Rails.root, 'your_folder','your_file.log')
last_100_lines = `tail -n 100 #{path}`
其他回答
一个简单的方法是使用readlines:
my_array = IO.readlines('filename.txt')
输入文件中的每一行都是数组中的一个条目。该方法为您处理打开和关闭文件的操作。
如果文件很小(吸声):
puts File.read("filename.txt")
如果文件很大(流媒体):
File.foreach("filename.txt") { |line| puts line }
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读取大文件的影响。
一种更有效的方法是流,它要求操作系统内核打开一个文件,然后一点一点地从中读取字节。在Ruby中逐行读取文件时,每次从文件中获取512字节的数据,然后按“行”分割。
通过缓冲文件的内容,在将文件划分为逻辑块的同时减少了I/O调用的数量。
例子:
将这个类作为服务对象添加到应用程序中:
class MyIO
def initialize(filename)
fd = IO.sysopen(filename)
@io = IO.new(fd)
@buffer = ""
end
def each(&block)
@buffer << @io.sysread(512) until @buffer.include?($/)
line, @buffer = @buffer.split($/, 2)
block.call(line)
each(&block)
rescue EOFError
@io.close
end
end
调用它并向:each方法传递一个块:
filename = './somewhere/large-file-4gb.txt'
MyIO.new(filename).each{|x| puts x }
在这篇详细的文章中阅读:
Ruby Magic slping &流媒体文件由AppSignal