在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.read
或File.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;
从your_file.log或.txt返回最后n行
path = File.join(Rails.root, 'your_folder','your_file.log') last_100_lines = `tail -n 100 #{path}`