如何在Ruby中写入文件?

oha*_*ana 553 ruby file-io

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

我怎么能在Ruby中做到这一点?Ruby中有文件管理系统吗?

Tod*_*d R 909

您在寻找以下内容吗?

File.open(yourfile, 'w') { |file| file.write("your text") }
Run Code Online (Sandbox Code Playgroud)

  • 简短而甜蜜:`File.write('filename','content')` (276认同)
  • 或者:f = File.open('name','w'); f.write( '文本'); f.close (14认同)
  • 甚至更短并记录:[`IO.write('filename','content')`](http://www.ruby-doc.org/core-2.1.0/IO.html#method-c-write) (12认同)
  • `yourfile`是一个变量,它包含要写入的文件的名称. (7认同)
  • @vish:我不推荐这个解决方案,因为如果`f.write`引发异常,文件描述符将保持打开状态. (5认同)
  • 它可能会返回受影响的字符数.我需要文件对象作为回报.有任何想法吗? (3认同)
  • @jj_它会打开,写入并关闭. (2认同)
  • @prem方法将返回块返回的内容.`File.open('yourfile','w'){| f | f.write( '文本'); f}`将返回一个文件对象. (2认同)
  • @BenjaminOakes这**会将**附加到文件中还是仅覆盖它? (2认同)

Séb*_*nec 612

您可以使用简短版本:

File.write('/path/to/file', 'Some glorious content')
Run Code Online (Sandbox Code Playgroud)

它返回写入的长度; 请参阅:: write以获取更多详细信息和选项.

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

File.write('/path/to/file', 'Some glorious content', mode: 'a')
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,这种速记方法仅适用于Ruby 1.9.3.在1.9或1.8的任何早期版本中都没有这样的方法.在这种情况下,您必须使用@mvndaai发布的较长块方法 (14认同)
  • 仅供参考,完成后会正确关闭文件. (13认同)
  • @JoshPinter:它会覆盖. (8认同)
  • 这**会将**附加到文件中还是仅覆盖它? (7认同)
  • [IO class docs](http://www.ruby-doc.org/core-1.9.3/IO.html#method-c-write)说它确实关闭了文件 (2认同)
  • 这似乎是ATM的最佳答案. (2认同)
  • 我认为这也是最好的答案 (2认同)

Tom*_*art 244

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

 File.open(yourfile, 'w') { |file| file.write("your text") }
Run Code Online (Sandbox Code Playgroud)

传递一个块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
Run Code Online (Sandbox Code Playgroud)

您可以在文档中找到它:

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;
}
Run Code Online (Sandbox Code Playgroud)


jdl*_*jdl 175

Ruby的文件类会给你的插件和出局::new::open但其父的IO类,进入的深度#read#write.

  • 可能因为你真正需要知道的一切都在这里.对于那些想要阅读更精细细节的人来说,我的是"教人钓鱼"的答案,而且这里有很多"给人一条鱼"的答案,对于那些只想剪切和粘贴的人来说也是如此.毫不奇怪,这种组合在Google上排名很高. (7认同)
  • 谢谢@Geoff.很高兴看到新用户清理过时的问题和答案.为整体提供更好的网站. (6认同)
  • 我觉得这很讽刺.答案很明确......但是现在一年之后,这个问题首次出现在Google上.当问到这个问题时,似乎OP似乎没有付出太多努力,但就Google而言,这是最好的来源. (5认同)
  • 这并不能回答问题。它仅仅指向包含大部分 I/O 方法的两个类,并没有提及与数据库的连接。作为评论来说这很好,但几乎没有资格作为答案。我意识到OP和许多投票支持这个答案的读者不同意,坦白说我不明白他们在想什么。 (4认同)
  • @jdl +1为"教人钓鱼"的答案!谢谢! (3认同)

mvn*_*aai 113

赞布里在这里找到的答案是最好的.

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

你的选择<OPTION>是:

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

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

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

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

w+ - 为读取和写入创建一个空文件.

a+ - 打开文件进行阅读和追加.如果文件不存在,则创建该文件.

在你的情况下,w是优选的.


l3x*_*l3x 31

对于我们这些通过实例学习的人......

将文本写入文件,如下所示:

IO.write('/tmp/msg.txt', 'hi')
Run Code Online (Sandbox Code Playgroud)

奖金信息......

像这样读回来

IO.read('/tmp/msg.txt')
Run Code Online (Sandbox Code Playgroud)

通常,我想将文件读入我的剪贴板***

Clipboard.copy IO.read('/tmp/msg.txt')
Run Code Online (Sandbox Code Playgroud)

有时候,我想把剪贴板中的内容写成文件***

IO.write('/tmp/msg.txt', Clipboard.paste)
Run Code Online (Sandbox Code Playgroud)

***假设您已安装剪贴板gem

请参阅:https://rubygems.org/gems/clipboard


Mar*_*jic 22

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

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

要附加到文件而不覆盖其旧内容:

open('myfile.txt', "a") { |f| f << 'I am appended string' } 
Run Code Online (Sandbox Code Playgroud)