在Ruby中读取文件的常用方法是什么?

在Ruby中读取文件的常用方法是什么?

例如,这里是一个方法:

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

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

 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 

也可以像上面那样明确地closures文件(通过一个块open为你closures):

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

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

 puts File.read(file_name) 

事实上, IO.readFile.read自动closures文件,因此不需要在块中使用File.open

警惕“啜泣”文件。 那就是当你把整个文件一次读入内存的时候。

问题是它不能很好地扩展。 您可能正在开发具有合理大小文件的代码,然后将其投入生产,并突然发现您正在尝试读取以千兆字节为单位的文件,并且您的主机在尝试读取和分配内存时正在冻结。

逐行I / O速度非常快,几乎总是和啜泣一样有效。 实际上这很快。

我喜欢用:

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

要么

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

文件从IOinheritance,而foreach在IO中,所以你可以使用。

我有一些基准testing,显示试图读取大文件的影响,通过read或逐行I / O在“ 为什么”sl“一个文件不是一个好的做法? ”。

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

 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 

最后,您可以在没有阻止的情况下执行此操作,例如,同时处理多个文件时。 在这种情况下,文件必须显式closures(根据@antinome的注释改进):

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

参考文件 : 文件API和IO API 。

一个简单的方法是使用readlines

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

input文件中的每一行都将是数组中的一个条目。 该方法处理打开和closures你的文件。

我通常这样做:

 open(path_in_string, &:read) 

这会给你整个文本作为一个string对象。 它只能在Ruby 1.9下运行。

 file_content = File.read('filename with extension'); puts file_content; 

http://www.ruby-doc.org/core-1.9.3/IO.html#method-c-read

从your_file.log或.txt返回最后n

 path = File.join(Rails.root, 'your_folder','your_file.log') last_100_lines = `tail -n 100 #{path}`