出于某种原因,我找不到任何提及如何做到这一点的教程...... 那么,我如何从文件中读取前n行?
我想出了:
while File.open('file.txt') and count <= 3 do |f|
...
count += 1
end
end
但它不起作用,对我来说也不是很好看。
出于好奇,我尝试过这样的事情:
File.open('file.txt').10.times do |f|
但这也不起作用。
那么,是否有一种简单的方法可以只读取前n行而无需加载整个文件? 非常感谢你!
答案 0 :(得分:24)
这是一个单线解决方案:
lines = File.foreach('file.txt').first(10)
我担心它可能不会以提示方式关闭文件(它可能只在垃圾收集器删除File.foreach返回的Enumerator后关闭文件)。但是,我使用了strace
,我发现如果你在没有块的情况下调用File.foreach
,它会返回一个枚举器,每次在该枚举器上调用first
方法时,它都会打开该文件,尽可能多地读取,然后关闭该文件。这很好,因为这意味着你可以使用上面的代码行,Ruby不会让文件保持打开状态。
答案 1 :(得分:5)
有很多方法可以在Ruby中解决这个问题。这是一种方式:
File.open('Gemfile') do |f|
lines = 10.times.map { f.readline }
end
答案 2 :(得分:3)
File.foreach('file.txt').with_index do |line, i|
break if i >= 10
puts line
end
答案 3 :(得分:0)
File继承自IO和Enumerable methods which include #first
中的IO混合
将整数传递给first(n)
将返回可编号集合中的前n个项目。对于File对象,每个项目都是文件中的一行。
File.open('filename.txt', 'r').first(10)
这将返回包含\ n换行符的行数组。
您可能想#join
来创建一个完整的字符串。
File.open('filename.txt', 'r').first(10).join
答案 4 :(得分:-1)
您可以尝试以下方法:
`head -n 10 file`.split
这不是真正的“纯粹的红宝石”,但现在这几乎不是必需的。