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
begin File .open ( "/tmp/some_file" ,"w" ) write ( "your text" )  rescue  IOError  =>  e#some error occur, dir not writable etc. ensure close  unless  file.nil ?end 
您可以在文档中找到它:
1
static VALUE rb_io_s_open( int argc, VALUE * argv, VALUE klass) { ( 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'  }