How to write to file in Ruby?
我需要从数据库中读取数据,然后将其保存到文本文件中。
我怎么能用红宝石做那个?Ruby中有文件管理系统吗?
您要查找以下内容吗?
1
File .open ( yourfile, 'w' ) { | file| file.write ( "your text" ) }
它可能返回受影响的字符数。我需要文件对象作为回报。有什么想法吗?
yourfile 是保存要写入的文件名的变量。
或者:f=file.open('name','w');f.write('text');f.close
@vish:我不推荐这个解决方案,因为如果f.write 引发异常,文件描述符将保持打开状态。
短而甜:File.write('filename', 'content') 。
更简短和有记录的:IO.write('filename', 'content') 。
@Benjaminoakes@Thai您还需要这样关闭文件吗?
@它为你打开、写和关闭。
@prem,如果你想要一个fd,那么你就不能使用proc。
@prem方法将返回块返回的内容。File.open('yourfile', 'w') { |f| f.write('text'); f } 将返回一个文件对象。
@Mehulkar:明白了。谢谢。
@Benjaminoakes会把这个附加到一个文件中还是仅仅覆盖它?
您可以使用短版本:
1
File .write ( '/path/to/file' , 'Some glorious content' )
它返回写入的长度;有关详细信息和选项,请参阅::write。
要附加到文件,如果该文件已存在,请使用:
1
File .write ( '/path/to/file' , 'Some glorious content' , mode: 'a' )
仅供参考,这个速记方法只能从Ruby1.9.3开始工作。在1.9或1.8的任何早期版本中都没有这种方法。在这种情况下,必须使用@mvndaai发布的更长的块方法
仅供参考,此操作完成后会正确关闭文件。
IO类文档说它确实关闭了文件
这将附加到文件还是只覆盖它?
@乔什平特:它会覆盖。
这似乎是ATM的最佳答案。
我认为这也是最好的答案
3年后,为了添加我自己的评论,您可以将mode: 'a' 作为第三个参数传递,如果该参数存在,它将附加到文件中。我用那个例子更新了答案。
在大多数情况下,这是首选的方法:
1
File .open ( yourfile, 'w' ) { | file| file.write ( "your text" ) }
当一个块传递给File.open 时,当该块终止时,文件对象将自动关闭。
如果不将块传递给File.open ,则必须确保文件已正确关闭,内容已写入文件。
1 2 3 4 5 6 7 8
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
您可以在文档中找到它:
1 2 3 4 5 6 7 8
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;
}
是的,使用块语法和文件…..}块关闭时将关闭文件。
很酷,谢谢。我不确定。以下是关于blocks和File.open blog.rubybestpractices.com/posts/rklemme/&hellip的更多信息;在官方文档中也提到过
只是Ruby-Way-Ish:nil是一个对象,所以为了检查文件是否为空,您询问对象本身而不是比较(file.nil?代替文件==nil)
@当然,这绝对是更像红宝石的方法,谢谢!
最后一个答案表明,您还应该检查文件状态以及如何处理它,而不仅仅是一个只显示打开的调用的行程序。
红宝石路:!file 。
Ruby文件类将为您提供::new 和::open 的输入和输出,但它的父类IO类深入到#read 和#write 的深度。
谢谢你,杰夫。很高兴看到新用户清理过时的问题和答案。使整个网站变得更好。
我觉得这很讽刺。答案记录得很好…但一年后的今天,这个问题成为谷歌的第一个热门话题。当被问到这个问题时,这一行动似乎没有付出多少努力,但就谷歌而言,这是最好的来源。
可能是因为你真正需要知道的一切都在这里。我的答案是"教人钓鱼",给那些想看更详细信息的人,这里有很多"给人一条鱼"的答案,也给那些只想剪切和粘贴的人。这一组合最终在谷歌排名上榜并不奇怪。
@JDL+1"教人钓鱼"的答案!谢谢您!
所以,公平地说,我使用了很多不同的语言,这意味着我很少有机会记住任何特定语言的语法。我已经在谷歌上搜索过几次了,我总是滚动到这个答案的正下方,因为当我搜索StackOverflow时,我通常只是在寻找一条危险的鱼。:p说实话,这两样都很好。也许有一天我会同时做足够的Ruby,我会关心细节。
赞比里的回答是最好的。
1
File .open ( "out.txt" , '<OPTION>' ) { | f| f.write ( "write your stuff here" ) }
如果您对 的选择是:
r —只读。文件必须存在。
w —创建一个空文件进行写入。
a —附加到文件。如果文件不存在,则创建该文件。
r+ —打开一个文件进行读写更新。文件必须存在。
w+ —创建一个空文件,用于读写。
a+ —打开一个文件进行读取和附加。如果文件不存在,则创建该文件。
在您的情况下,最好是w 。
对于我们这些以身作则的人…
将文本写入这样的文件:
1
IO .write ( '/tmp/msg.txt' , 'hi' )
奖金信息…
像这样读回
我经常想把一个文件读到我的剪贴板上。
1
Clipboard.copy IO .read ( '/tmp/msg.txt' )
有时,我想把剪贴板上的内容写到一个文件中。
1
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字节大小的文件。
要销毁文件的先前内容,请将新字符串写入该文件:
1
open ( 'myfile.txt' , 'w' ) { | f| f << "some text or data structures..." }
要附加到文件而不覆盖其旧内容,请执行以下操作:
1
open ( 'myfile.txt' ,"a" ) { | f| f << 'I am appended string' }