如何在 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.openblog.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") 

&lt;OPTION&gt; 的选项在哪里:

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 中写入文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何检测文件是不是可在 Ruby 中写入?

如何根据位置将一些值写入ruby中的文本文件

如何将在从控制台获取的 URL 中找到的特定字符串替换为在 Ruby 文本文件中写入的每一行中找到的文件内容?

将字符串写入文件以供下载 Ruby on Rails

使用 Ruby 逐行读取、编辑和写入文本文件

ruby excel - 将数据写入现有的xls