将整个文本文件作为单个字符串读取的合理方法是啥?
Posted
技术标签:
【中文标题】将整个文本文件作为单个字符串读取的合理方法是啥?【英文标题】:What's a reasonable way to read an entire text file as a single string?将整个文本文件作为单个字符串读取的合理方法是什么? 【发布时间】:2011-09-22 06:26:31 【问题描述】:我相信这很容易;我只是无法立即从 Google 中找到答案。
我知道我可以做到(对吗?):
text = ""
File.open(path).each_line do |line|
text += line
end
# Do something with text
但这似乎有点过分,不是吗?或者这就是在 Ruby 中的做法?
【问题讨论】:
警告:将文件读入内存,也就是 slurping,存在可扩展性问题。 Ruby 以及 Perl 和其他语言可以逐行读取文件,其速度几乎与读取、拆分和循环文件一样快。 @the Tin Man:这是个好建议,我感谢你。这个问题是不久前提出的,所以我可能记错了;但我相信我当时的意图是对文件的文本进行一些多行正则表达式匹配,所以我确实需要内存中的整个内容(即,我不只是打算逐行阅读)。 【参考方案1】:我在搜索时找到的第一个结果。
我想改变模式,IO.read
似乎不可能,除非我错了?
无论如何,你可以这样做:
data = File.open(path,'rb',&:read)
当您想使用任何其他选项时,它也很有用:
https://ruby-doc.org/core/IO.html#method-c-new
【讨论】:
【参考方案2】:IO.read() 是您要查找的内容。File 是 IO 的子类,因此您不妨使用:
text = File.read(path)
没有比这更直观的了。
【讨论】:
就像我对 sm 的问题一样,IO 或 File 是否将整个文件读入内存,或者它是否使用带有 SEEK 的文件指针来跟踪它而不是将大文件加载到内存中? @Pred 将其加载到字符串中,因此加载到内存中。【参考方案3】:IO.read()
呢?
编辑:IO.read()
,作为额外的奖励,会为您关闭文件。
【讨论】:
这会将整个文件放入内存中,还是保留一个文件指针,这样它就不会使用所有的 RAM 来读取一个大文件?以上是关于将整个文本文件作为单个字符串读取的合理方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 csv 文件转换为可作为文本读取的列表列表? Python