66

我只想以最快、最简单、最惯用的方式使用 Ruby 读取文件的第一行最好的方法是什么?

(特别是:我想从我最新的 Capistrano 部署 Rails 目录中的 REVISION 文件中读取 git commit UUID,然后将其输出到我的标签。这将让我在 http-glance 中看到部署到我的服务器的版本. 如果有完全不同和更好的方法可以做到这一点,请告诉我。)

4

8 回答 8

119

这将准确读取一行并确保文件在之后立即正确关闭。

strVar = File.open('somefile.txt') {|f| f.readline}
# or, in Ruby 1.8.7 and above: #
strVar = File.open('somefile.txt', &:readline)
puts strVar
于 2009-09-29T01:39:05.280 回答
25

这是一种简洁的惯用方法,可以正确打开文件进行读取并在之后关闭它。

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

如果您希望空文件导致异常,请改用它。

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

此外,这里有一个快速而肮脏的 head 实现,可以满足您的目的,并且在您想多读几行的许多其他情况下。

# 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
于 2011-01-18T17:16:09.687 回答
7

你可以试试这个:

File.foreach('path_to_file').first
于 2009-09-29T01:36:32.667 回答
6

如何读取 ruby​​ 文件中的第一行:

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

或者,您可以从应用程序内部执行 git-log:

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

%H 告诉格式打印完整的提交哈希。还有一些模块允许你从 Rails 应用程序内部以更 ruby​​ 的方式访问本地 git repo,尽管我从未使用过它们。

于 2009-09-29T01:39:26.527 回答
4
first_line = open("filename").gets
于 2009-09-29T01:36:31.443 回答
3

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

ruby -e 'puts `head -n 1 filename`'  #(backtick before `head` and after `filename`)
于 2009-10-14T04:58:43.780 回答
2
first_line = File.readlines('file_path').first.chomp
于 2013-08-14T13:51:13.970 回答
2

改进@Chuck 发布的答案,我认为可能值得指出的是,如果您正在阅读的文件为空,则会引发 EOFError 异常。捕获并忽略异常:

def readit(filename)
 text = ""
 begin
   text = File.open(filename, &:readline)
 rescue EOFError
 end
 text
end
于 2017-05-20T20:24:52.610 回答