如何在 Ruby 中写入文件?
Posted
技术标签:
【中文标题】如何在 Ruby 中写入文件?【英文标题】:How to write to file in Ruby? 【发布时间】:2011-02-16 04:39:58 【问题描述】:我需要从数据库中读取数据,然后将其保存在文本文件中。
如何在 Ruby 中做到这一点? Ruby 中有没有文件管理系统?
【问题讨论】:
【参考方案1】:你可以使用短版:
File.write('/path/to/file', 'Some glorious content')
它返回写入的长度;有关更多详细信息和选项,请参阅::write。
要附加到文件,如果它已经存在,使用:
File.write('/path/to/file', 'Some glorious content', mode: 'a')
【讨论】:
仅供参考,此速记方法仅适用于从 Ruby 1.9.3 开始。在 1.9 或 1.8 的任何早期版本中都没有这种方法。在这种情况下,您必须使用 @mvndaai 发布的更长的块方法 仅供参考,完成后确实会正确关闭文件。 IO class docs 说它确实关闭了文件 这个追加到文件还是直接覆盖? @JoshPinter:它会覆盖。【参考方案2】:要销毁文件之前的内容,然后在文件中写入一个新的字符串:
open('myfile.txt', 'w') |f| f << "some text or data structures..."
附加到文件而不覆盖其旧内容:
open('myfile.txt', "a") |f| f << 'I am appended string'
【讨论】:
【参考方案3】:Ruby File class 将为您提供::new
和::open
的来龙去脉,但它的父级IO class 深入了解#read
和#write
。
【讨论】:
谢谢@Geoff。很高兴看到新用户清理过时的问题和答案。使网站整体更好。 我觉得这很讽刺。答案有据可查......但现在一年后,这个问题是谷歌的第一个热门话题。当被问到这个问题时,看起来 OP 似乎没有付出什么努力,但现在就 Google 而言,这是最好的来源。 可能是因为您真正需要知道的一切都在这里。对于那些想要阅读更详细的细节的人来说,我的答案是“教人钓鱼”,对于只想剪切和粘贴的人来说,这里也有很多“给男人一条鱼”的答案。毫不奇怪,这种组合最终在 Google 上排名很高。 所以,公平地说,我使用许多不同的语言工作,这意味着我很少有时间去记住任何特定语言的语法。我已经用谷歌搜索了几次,我总是向右滚动过去这个答案,到它下面的那个,因为当我用谷歌搜索 *** 时,我通常只是在寻找一条小鱼。 :p 老实说,两者都很好。也许有一天我会同时做足够多的 Ruby,我会关心细节。 这没有回答问题。它只指出了包含大部分 I/O 方法的两个类,并没有提及与数据库的连接。这可以作为评论,但几乎不能作为答案。我意识到 OP 和许多支持这个答案的读者不同意,坦率地说,我不明白他们在想什么。【参考方案4】:在大多数情况下这是首选方法:
File.open(yourfile, 'w') |file| file.write("your text")
当一个块被传递给File.open
时,文件对象将在块终止时自动关闭。
如果您不将块传递给File.open
,则必须确保该文件已正确关闭并且内容已写入文件。
begin
file = File.open("/tmp/some_file", "w")
file.write("your text")
rescue IOError => e
#some error occur, dir not writable etc.
ensure
file.close unless file.nil?
end
你可以在documentation找到它:
static VALUE rb_io_s_open(int argc, VALUE *argv, VALUE klass)
VALUE io = rb_class_new_instance(argc, argv, klass);
if (rb_block_given_p())
return rb_ensure(rb_yield, io, io_close, io);
return io;
【讨论】:
是的,使用带有 |file| 的块语法.... 将在块关闭时关闭文件。 酷,谢谢。我不确定。这里有更多关于块的信息,File.open
blog.rubybestpractices.com/posts/rklemme/… 在官方文档中也提到了
只是一些 ruby 方式-ish:nil 是一个对象,因此要检查文件是否为空,您需要询问对象本身而不是比较 (file.nil? 而不是 file == nil)
@JCabello 当然,这绝对是更像 Ruby 的方法,谢谢!
最后一个答案表明人们还应该检查文件状态以及如何处理它,而不仅仅是一个只显示打开调用的衬垫。【参考方案5】:
对于我们这些通过例子学习的人......
像这样将文本写入文件:
IO.write('/tmp/msg.txt', 'hi')
奖励信息 ...
像这样读回来
IO.read('/tmp/msg.txt')
我经常想将一个文件读入我的剪贴板***
Clipboard.copy IO.read('/tmp/msg.txt')
而其他时候,我想将剪贴板中的内容写入文件 ***
IO.write('/tmp/msg.txt', Clipboard.paste)
*** 假设您已安装剪贴板 gem
见:https://rubygems.org/gems/clipboard
【讨论】:
当心IO.write
选项覆盖文件内容而不是追加。附加 IO.write 有点繁琐。
不确定您在说什么? IO.write 命令不需要该选项来写入文件。我会小心地将文件保存到 /tmp 目录或当前目录;否则,您可能会看到 Errno::ENOENT: No such file or directory @ rb_sysopen
消息和创建的大小为 0 字节的文件。【参考方案6】:
Zambri的回答found here是最好的。
File.open("out.txt", '<OPTION>') |f| f.write("write your stuff here")
<OPTION>
的选项在哪里:
r
- 只读。该文件必须存在。
w
- 创建一个空文件用于写入。
a
- 附加到文件。如果文件不存在,则创建该文件。
r+
- 打开一个文件以更新读写。该文件必须存在。
w+
- 为读写创建一个空文件。
a+
- 打开一个文件进行读取和附加。如果文件不存在,则创建该文件。
在您的情况下,w
更可取。
【讨论】:
@CarySwoveland 我真的同意你的看法。真正的问题是,这两个问题之一应该在很久以前就被标记为重复了。我复制了答案,因为一旦我发现 zanbri 已经回答了这个问题,接下来的几次当我需要相同的信息时,我首先遇到了这个问题,并且不得不弄清楚如何解决另一个问题。最终,我认为在这里也有他的答案会更容易。我链接到他的答案,希望人们也会点击并给他一个赞成票。【参考方案7】:您在寻找以下内容吗?
File.open(yourfile, 'w') |file| file.write("your text")
【讨论】:
yourfile
是一个保存要写入的文件名的变量。
或者:f = File.open('name','w'); f.write('文本'); f.close
@vish:我不推荐这种解决方案,因为如果f.write
引发异常,文件描述符将保持打开状态。
又短又甜:File.write('filename', 'content')
更短且有文档记录:IO.write('filename', 'content')
以上是关于如何在 Ruby 中写入文件?的主要内容,如果未能解决你的问题,请参考以下文章