【问题标题】:How to read whole file in Ruby?如何在 Ruby 中读取整个文件?
【发布时间】:2011-03-20 16:48:52
【问题描述】:

Ruby 中是否有一个内置函数可以在不使用任何循环的情况下读取整个文件?到目前为止,我只遇到过以块(行或字符)读取的方法。

【问题讨论】:

  • 对于它的价值,这是人们经常想要但并不真正需要的东西。 (如果文件非常大,当文件 slurping 吞噬所有可用内存时,您可能会感到非常意外。)您最终想要完成什么?
  • 我发现这对于处理不是日常格式的文件非常有帮助。我正在阅读一个 IBM437 编码的文件,需要在奇怪的字符处破坏文件,以将有价值的数据与我不需要的东西分开。为此,阅读整个文件然后在它们应该在的位置创建我自己的换行符是有意义的。否则我会传入每一行或每个字符。相反,我可以简单地使用它来读取文件,然后使用 split 将文件分解为可打印字符的字符串,然后使用块来确定我需要的数据集。

标签: ruby file


【解决方案1】:
IO.read("filename")

File.read("filename")

【讨论】:

  • 只是出于好奇,为什么在这里找不到这个功能:ruby-doc.org/core-2.1.2/File.html
  • @MartinKonecny 因为File::read 实际上是从IO::read 继承的——它们都是完全相同的,因为File 扩展了IO
【解决方案2】:
File.readlines("filename")

这也是从文件中读取所有内容并在回车时中断拆分的好方法。返回的是一个数组,每个元素一行。

【讨论】:

  • 更具体地说,readlines 拆分内部变量$/,默认为“\n”。但是,您可以临时重置$/,也可以将文件读入以其他方式分隔的块中。
【解决方案3】:

请忽略“您永远不应该啜饮(这是一个令人讨厌的术语)文件”的建议。有时这是一件非常有用且明智的事情。

假设您正在重复读取一个文件:将文件读入数组是对逐行读取文件的明智优化,即使考虑到 o/s 将缓存文件。

【讨论】:

  • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post。 - From Review
  • 对不起,但对建立代表不感兴趣。 “不要啜食”的建议是完全错误的。它有时是一种有用的技术(我刚刚通过读取整个文件将程序的运行时间减少了 1000 倍),不应该被弃用。
  • 一旦文件大小达到 1MB+,一次将文件读入内存(slurping)并不比逐行快。除此之外,您可以更快地逐行阅读,并避免潜在的可伸缩性问题。如果不解释什么时候合适,“完全错误”是没有帮助的。请参阅stackoverflow.com/questions/25189262/why-is-slurping-a-file-bad 了解更多信息。
  • 好吧,我想我举了一个例子——你在反复阅读文件。将它放在数组中很有用。我已经(被支付)以 20 多种语言编程,所以怀疑我有一些见识。我在某些事情上是教条主义的(cmets 是一种代码气味),但不是这个。当它使代码更具可读性或解决方案更易于掌握时使用它。如果它非常次优或使解决方案更复杂,请不要使用它。我重申我的观点关于声誉。我会把它留给那些试图为他们的简历加分的业余爱好者。
猜你喜欢
  • 1970-01-01
  • 2011-08-26
  • 2010-11-20
  • 2012-05-10
  • 1970-01-01
  • 2013-06-01
  • 2015-08-07
  • 2015-12-30
  • 1970-01-01
相关资源
最近更新 更多