2009-09-29 80 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