在 Ruby 中读取文件的第一行

Posted

技术标签:

【中文标题】在 Ruby 中读取文件的第一行【英文标题】:Reading the first line of a file in Ruby 【发布时间】:2010-12-02 04:28:32 【问题描述】:

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

(具体来说:我想从我最新的 Capistrano 部署的 Rails 目录中的 REVISION 文件中读取 git commit UUID,然后将其输出到我的标签。这将让我一目了然地看到部署了什么版本到我的服务器。如果有完全不同且更好的方法可以做到这一点,请告诉我。)

【问题讨论】:

【参考方案1】:
first_line = File.readlines('file_path').first.chomp

【讨论】:

虽然可以,但是不会把整个文件加载到内存中吗?【参考方案2】:

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

strVar = File.open('somefile.txt') |f| f.readline
# or, in Ruby 1.8.7 and above: #
strVar = File.open('somefile.txt', &:readline)
puts strVar

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

更简单的实现:class File; def self.head(path, n = 1); foreach(path).first(n); end; end (6 年后....)在前两个示例中发生了什么,其中符号作为打开的第二个参数?我找不到任何解释它在做什么的文档。感谢任何信息... @skydvr 阅读此***.com/questions/14881125/…【参考方案6】:

你可以试试这个:

File.foreach('path_to_file').first

【讨论】:

LocalJumpError: 没有给出块 @klochner:你的 Ruby 已经过时了。这在 1.8.7 及更高版本中运行良好。 对不起,文森特,除非您进行一些小的修改,否则我无法删除反对票。 我赞成这个,因为我喜欢它的“第一”。不幸的是,我的 Rails 主机 (DreamHost) 仅在 1.8.5 上,所以它对我来说不是“正确”的主机。 :-\ 我喜欢“first”的表现力,但不喜欢具有误导性的“foreach”。我想“完美”(?)答案是猴子修补 File#first_line(path) 方法。【参考方案7】:

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

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

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

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

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

【讨论】:

.last 没有按我在这里的计划工作。最后一行怎么做?【参考方案8】:
first_line = open("filename").gets

【讨论】:

这之后会关闭文件吗? 我还收到了使用 Kernal#open: rubocop.readthedocs.io/en/latest/cops_security/#securityopen 的 Rubocop 安全警告

以上是关于在 Ruby 中读取文件的第一行的主要内容,如果未能解决你的问题,请参考以下文章

如何只读取文件的第一行

python读取指定目录中所有文本文件的第一行,并以此为该文本文件名重命名

Ruby 读取文件

使用 Pyspark 使用 Spark 读取巨大 Json 文件的第一行

如何使用 cat 读取文件的第一行?

只读取文件的第一行?