如何在Ruby中写入文件?


571

我需要从数据库中读取数据,然后将其保存在文本文件中。

如何在Ruby中做到这一点?Ruby中有文件管理系统吗?

Answers:


178

Ruby File类将为您提供详细信息::new::open但其父类IO类将深入到#readand #write


6
谢谢@杰夫。很高兴看到新用户清除过时的问题和答案。使整体网站更好。
jdl 2012年

7
我觉得这很讽刺。答案有据可查...但是现在一年后,这个问题在Google上首当其冲。当问到这个问题时,OP似乎并没有付出太多努力,但是就Google而言,这是最好的来源。
杰夫

7
可能是因为您真正需要知道的一切都在这里。对于那些想了解更详细信息的人来说,我的答案是“教人钓鱼”,对于那些只想剪切粘贴的人来说,这里有很多“给人鱼钓鱼”的答案。毫无疑问,这种组合在Google上排名很高。
jdl 2013年

1
因此,公平地说,我使用多种不同的语言,这意味着我很少回想起任何特定语言的语法。我这个GOOGLE了几次,我总是向右滚动过去的这个答案,在一个下面,因为当我谷歌的StackOverflow我通常只是寻找一个党的鱼。:p坦白地说,两者兼而有之。也许有一天,我将一次完成足够的Ruby,以便我关心细节。
user435779

2
这不能回答问题。它仅指向包含大多数执行I / O方法的两个类,并且未提及与数据库的连接。可以将其作为评论很好,但很难作为答案。我意识到OP和许多支持此答案的读者不同意,并且坦率地说,我不理解他们的想法。
卡里·斯沃夫兰

929

您在寻找以下物品吗?

File.open(yourfile, 'w') { |file| file.write("your text") }

8
yourfile是一个变量,其中包含要写入的文件的名称。
B 2012年

17
或者:f = File.open('name','w'); f.write('text'); f.close
vish

5
@vish:我不建议使用此解决方案,因为如果f.write引发异常,文件描述符将保持打开状态。
nbarraille

288
简短而甜蜜:File.write('filename', 'content')
本杰明·奥克斯

14
甚至更短并有记载:IO.write('filename', 'content')
泰国

636

您可以使用简短版本:

File.write('/path/to/file', 'Some glorious content')

它返回写入的长度;有关更多详细信息和选项,请参见:: write

要附加到文件(如果已经存在),请使用:

File.write('/path/to/file', 'Some glorious content', mode: 'a')

14
仅供参考,此速记方法仅适用于Ruby 1.9.3。在任何较早的1.9或1.8版本中都没有这种方法。在这种情况下,您必须使用@mvndaai发布的更长的块方法
Andrew Burns

13
仅供参考,完成后确实可以正确关闭文件。
Freedom_Ben 2014年

2
IO类文档说它确实关闭了文件
2015年

7
将追加到文件还是其覆盖?
2015年

8
@JoshPinter:它会覆盖。
mklement0

248

在大多数情况下,这是首选方法:

 File.open(yourfile, 'w') { |file| file.write("your text") }

当将一个块传递给File.open时,该块终止时File对象将自动关闭。

如果您没有将块传递给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

您可以在文档中找到它:

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 |一起使用 ....}将在块关闭时关闭文件。
wesgarrison

太好了,谢谢。我不确定。这里是有关方块和File.open blog.rubybestpractices.com/posts/rklemme/的更多信息。…官方文档中也提到了该内容
Tombart

1
只是某种红宝石的方式:nil是一个对象,因此要检查文件是否为空,请询问对象本身而不是进行比较(file.nil?而不是file == nil)
JCabello

@JCabello当然,这肯定是更像Ruby的方法,谢谢!
Tombart

最后一个答案表明,还应该检查文件状态以及如何处理它,而不仅仅是一个仅显示公开呼叫的衬板。
纳赛尔2015年

115

Zambri 在这里找到的答案是最好的。

File.open("out.txt", '<OPTION>') {|f| f.write("write your stuff here") }

您可以选择的位置<OPTION>是:

r- 只读。该文件必须存在。

w -创建一个空文件进行写入。

a -附加到文件。如果文件不存在,则创建该文件。

r+-打开文件以同时更新读取和写入。该文件必须存在。

w+ -创建一个用于读取和写入的空文件。

a+-打开文件进行读取和附加。如果文件不存在,则创建该文件。

在您的情况下,w更可取。


我错失了一个答案,该答案若无其事地复制了另一个答案,则可能会收到100多个投票。我可以看到张贴第一句话作为对该问题的评论,仅此而已。
卡里·斯沃夫兰

@CarySwoveland我实际上同意你的看法。真正的问题是,两个问题之一早已被标记为重复。我复制了答案,因为一旦发现zanbri问题已经回答了,接下来的几次我需要相同的信息时,我首先遇到了这个问题,并且不得不弄清楚如何解决另一个问题。最终,我认为在这里得到他的答案也会更容易。我希望将其链接到他的答案,希望人们会点击并给他投票。
mvndaai

31

对于那些以身作则学习的人...

将文本写到这样的文件中:

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


1
请注意,该IO.write选项会覆盖文件内容,而不是覆盖文件内容。附加IO.write有点乏味。
fguillen

不知道您在说什么?IO.write命令不需要该选项即可写入文件。我将文件保存到/ tmp目录或当前目录时要小心;否则,您可能会看到一条Errno::ENOENT: No such file or directory @ rb_sysopen消息,并且创建的文件大小为0字节。
l3x

25

要销毁文件的先前内容,然后将新字符串写入文件:

open('myfile.txt', 'w') { |f| f << "some text or data structures..." } 

要追加到文件而不覆盖其旧内容,请执行以下操作:

open('myfile.txt', "a") { |f| f << 'I am appended string' } 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.