2009-09-29 63 views
50

我想只读使用Ruby以最快,最简单,最习惯的方式执行的文件的第一行。什么是最好的方法?阅读Ruby中文件的第一行

(具体来说:我想在我的最新Capistrano部署的Rails目录中读取REVISION文件中的git commit UUID,然后将其输出到我的标记中,这会让我在http浏览时看到什么版本是部署到我的服务器如果有这样做完全不同的&更好的办法,请让我知道)

回答

93

这将读取恰好一行,并确保该文件被正确关闭后立即。

File.open('somefile.txt') {|f| f.readline} 
# or, in Ruby 1.8.7 and above: # 
File.open('somefile.txt', &:readline) 
3
first_line = open("filename").gets 
7

你可以试试这个:。

File.foreach('path_to_file').first 
+0

LocalJumpError:没有给出的块 – klochner 2009-09-29 01:43:28

+3

@klochner:你的Ruby是旧的。这在1.8.7及更高版本中工作正常。 – Chuck 2009-09-29 01:55:08

+0

对不起文森特,我不能删除downvote,除非你做一些小修改。 – klochner 2009-09-29 02:09:22

5

如何读取红宝石文件的第一行:

commit_hash = File.open("filename.txt").first 

或者你可以只是做一个从你的应用程序中的Git日志:

commit_hash = `git log -1 --pretty=format:"%H"` 

的%H告诉打印完整提交哈希的格式。还有一些模块可以让你以Rails应用程序的方式访问你的本地git仓库,尽管我从未使用它们。

+0

.last不按我在这里计划的那样工作。我如何为最后一行做到这一点? – 2012-07-20 22:15:44

1

我认为调查git --pretty选项的jkupferman建议是最有意义的,然而,另一种方法是head命令,例如,

ruby -e 'puts `head -n 1 filename`' #(backtick before `head` and after `filename`) 
+0

https://gist.github.com/784711 – maletor 2011-01-18 18:49:19

15

下面是一个简洁的惯用方式,它可以正确打开文件进行阅读,然后关闭它。

File.open('path.txt', &:gets) 

如果你想让一个空文件导致异常,请改用它。

File.open('path.txt', &:readline) 

而且,这里有一个快速&肮脏实施头要读几行,将你的目的,而且在许多其他情况下的工作。

# Reads a set number of lines from the top. 
# Usage: File.head('path.txt') 
class File 
    def self.head(path, n = 1) 
    open(path) do |f| 
     lines = [] 
     n.times do 
      line = f.gets || break 
      lines << line 
     end 
     lines 
    end 
    end 
end 
+1

更简单的实现:'class File; def self.head(path,n = 1);的foreach(路径)。首先(N);结束;结尾' – 2014-11-11 14:23:38

+1

(6年后....)在第一个2个例子中,符号作为第二个参数打开时发生了什么?我无法找到任何解释正在做什么的文档。 Thx的任何信息... – skydvr 2017-12-14 16:51:36

2

first_line = File.readlines('file_path').first.chomp

+1

虽然它的工作原理,但它不会加载整个文件在内存中? – Saim 2016-05-20 22:39:21

2

提高上发表@Chuck答案,我想这可能是值得指出的是,如果你正在阅读的文件是空的,EOFError异常将被抛出。抓住并忽略异常:

def readit(filename) 
text = "" 
begin 
    text = File.open(filename, &:readline) 
rescue EOFError 
end 
text 
end