如何在Ruby中读取整个文件?

69

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


3
就价值而言,这是人们经常想要但实际上并不需要的东西。(如果文件很大,当文件读取程序几乎占用了所有可用内存时,你可能会受到令人不愉快的惊喜。)你最终想要实现什么? - Telemachus
我发现这对于处理非常规格式的文件非常有帮助。我正在读取一个使用IBM437编码的文件,并需要在奇怪的字符处分割文件,以将有价值的数据与不需要的内容分开。为此,最好先读取整个文件,然后在应该有换行符的位置创建自己的换行符。否则,我将传递每一行或每个字符。相反,我可以简单地使用这个来读取文件,然后使用split在可打印字符的字符串处分割文件,然后使用块来确定我需要的数据集。 - ndw
我建议阅读https://dev59.com/ul8e5IYBdhLWcg3w9-Ns。 - the Tin Man
3个回答

105
IO.read("filename")
或者
File.read("filename")

3
只是出于好奇,为什么我在这里找不到这个函数:http://www.ruby-doc.org/core-2.1.2/File.html - Martin Konecny
5
@MartinKonecnyжҳҜеӣ дёәFile::readе®һйҷ…дёҠ继жүҝиҮӘIO::read - е®ғ们е®Ңе…ЁзӣёеҗҢпјҢеӣ дёәFileжү©еұ•дәҶIOгҖӮ - Moshe Katz

21
File.readlines("filename")

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


12
更具体地说,readlines 函数根据内部变量 $/ 进行分割,默认情况下为 "\n"。但是你可以暂时重置 $/,以其他方式对文件进行分块读取。 - Telemachus

5
请忽略那些声称“您永远不应该吞咽(这是一个讨厌的术语)文件”的建议。有时这是非常有用和明智的做法。
假设您需要反复读取一个文件:将文件读入数组可能是比逐行读取文件更明智的优化方法,即使考虑到操作系统会缓存文件。

3
这并没有回答问题。如果您想对作者进行批评或请求澄清,请在他们的帖子下留言——您始终可以在自己的帖子上进行评论,一旦您获得足够的声望,您就可以评论任何帖子。- 来自审查 - ndnenkov
2
抱歉,但我对建立声誉并不感兴趣。关于“不要吸气”的建议是完全错误的。这有时是一种有用的技术(我刚刚通过读取整个文件将程序的运行时间缩短了1000倍),不应该被弃用。 - Graham Nicholls
一次性将文件读入内存(slurping)并不比逐行读取更快,当文件大小超过1MB时。超出这个点后,你可以更快地逐行读取,并避免潜在的可扩展性问题。“只是简单错误”没有解释何时适用是没有帮助的。有关更多信息,请参见https://dev59.com/ul8e5IYBdhLWcg3w9-Ns。 - the Tin Man
1
我认为我已经举了一个例子 - 你一遍又一遍地读取文件。将其放入数组中会很有用。我曾经(被付费)使用过20多种编程语言,因此我认为我有一些见解。在某些事情上我很教条主义(注释是代码异味),但在这件事上不是。当它使代码更易读或解决方案更容易理解时,请使用它。如果它非常次优或使解决方案更加复杂,则不要使用它。我重申我的声誉观点。我会把这留给那些试图为他们的简历获得积分的业余爱好者。 - Graham Nicholls

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接