ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Ruby 中写入文件?

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

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


M
Matthew Simoneau

您在寻找以下内容吗?

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')
J
Joshua Pinter

您可以使用简短版本:

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:它会覆盖。
T
Tombart

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

 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/… 在官方文档中也有提及
只是一些红宝石方式:nil 是一个对象,因此要检查文件是否为空,您需要询问对象本身而不是比较(file.nil?而不是 file == nil)
@JCabello 当然,这绝对是更像 Ruby 的方法,谢谢!
最后一个答案表明,人们还应该检查文件状态以及如何处理它,而不仅仅是一个只显示打开呼叫的班轮。
M
Michael Gaskill

Ruby File class 将为您提供 ::new::open 的来龙去脉,但它的父级 IO class 深入到 #read#write


谢谢@Geoff。很高兴看到新用户清理过时的问题和答案。使网站整体更好。
我觉得这很讽刺。答案有据可查......但现在一年后,这个问题是谷歌的第一个热门话题。当被问到这个问题时,看起来 OP 似乎没有付出什么努力,但现在就 Google 而言,这是最好的来源。
可能是因为你真正需要知道的一切都在这里。对于那些想要阅读更详细的细节的人来说,我的答案是“教人钓鱼”,对于只想剪切和粘贴的人来说,这里也有很多“给男人一条鱼”的答案。毫不奇怪,这种组合最终在 Google 上排名很高。
所以,公平地说,我使用很多不同的语言工作,这意味着我很少有时间去记住任何特定语言的语法。我已经用谷歌搜索了几次,我总是从这个答案滚动到它下面的答案,因为当我用谷歌搜索 StackOverflow 时,我通常只是在寻找一条小鱼。 :p 老实说,两者都很好。也许有一天我会同时做足够多的 Ruby,我会关心细节。
这没有回答问题。它只指出了包含大部分 I/O 方法的两个类,并没有提及与数据库的连接。这可以作为评论,但几乎不能作为答案。我意识到 OP 和许多支持这个答案的读者不同意,坦率地说,我不明白他们在想什么。
C
Community

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 已经回答了这个问题,接下来的几次当我需要相同的信息时,我首先遇到了这个问题,并且不得不弄清楚如何解决另一个问题。最终,我认为在这里也有他的答案会更容易。我链接到他的答案,希望人们也会点击并给他一个赞成票。
l
l3x

对于我们这些以身作则的人...

将文本写入这样的文件:

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 字节。
M
Marko Tunjic

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

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

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

open('myfile.txt', "a") { |f| f << 'I am appended string' }