2010-07-25 36 views
54

在Ruby中是否有內置的函數來讀取整個文件而不使用任何循環?到目前爲止,我只會遇到以塊(線或字符)讀取的方法。如何在Ruby中讀取整個文件?

+3

對於什麼是值得的,這是人們經常想要的東西,但並不真正需要。 (如果文件非常大,當文件在您的所有可用內存附近咕嚕咕嚕地發出咕嚕聲時,您可能會感到非常驚訝。)您最終想要完成什麼? – Telemachus 2010-07-25 12:00:07

+0

我發現這對於處理不是每天格式的文件非常有幫助。我正在IBM437編碼中讀取一個文件,並需要用古怪的字符打破文件,將有價值的數據從我不需要的東西中分離出來。爲此,閱讀整個文件然後創建自己的換行符應該是合理的。否則,我會傳遞每行或每個字符。相反,我可以簡單地使用它來讀取文件,然後使用split以可打印字符的字符串打破文件,然後使用塊來確定我需要的數據集。 – ndw 2013-03-29 22:15:59

+0

我建議閱讀http://stackoverflow.com/questions/25189262/why-is-slurping-a-file-bad。 – 2016-12-15 17:41:21

回答

78
IO.read("filename") 

File.read("filename") 
+3

文檔:http://ruby-doc.org/core/classes/IO.html – quantumSoup 2010-07-25 08:13:37

+0

只是出於好奇,爲什麼我不能在這裏找到這個功能:http://www.ruby-doc.org/core- 2.1.2/File.html – 2014-06-19 20:10:24

+4

@MartinKonecny由於'File :: read'實際上是從'IO :: read'繼承來的 - 它們都是完全相同的,因爲'File'擴展了'IO'。 – 2014-08-19 03:22:45

18
File.readlines("filename") 

這也是閱讀一切從文件和回車打破分割一個偉大的方法。返回值是一個數組,每個元素包含一行。

+10

更具體地說,'readlines'在內部變量'$ /'上分割,默認爲「\ n」。但是,您可以暫時重置'$ /',並將文件讀入以其他方式分隔的塊。 – Telemachus 2010-07-25 12:32:10

5

請忽略建議,其中指出「你永遠不應該啜泣(這是一個令人討厭的術語)一個文件」。有時候,這是一個非常有用和明智的事情。

假設您正在重複讀取文件:即使考慮到o/s將緩存文件,將文件讀入數組的好處是逐行讀取文件的明智優化。

+1

這不提供問題的答案。要批評或要求作者澄清,在他們的帖子下留下評論 - 你總是可以評論你自己的帖子,一旦你有足夠的[聲譽](http://stackoverflow.com/help/whats-reputation),你會能夠[評論任何帖子](http://stackoverflow.com/help/privileges/comment)。 - [來自評論](/ review/low-quality-posts/10916920) – ndn 2016-01-17 02:32:05

+1

對不起,但根本沒興趣處理代表。對「不流氓」的建議顯然是錯誤的。它有時是一種有用的技術(我只是通過讀取整個文件將程序的運行時間減少了1000倍),並且不應該被棄用。 – 2016-01-18 08:36:24

+0

一旦一個文件達到1MB +的大小,一次讀取文件到內存中(sl))沒有比逐行更快的速度。除此之外,您可以更快地逐行閱讀,並避免潛在的可伸縮性問題。 「只是錯誤的」沒有解釋什麼時候是合適的沒有幫助。有關更多信息,請參閱http://stackoverflow.com/questions/25189262/why-is-slurping-a-file-bad。 – 2016-12-15 17:45:40