674

I need to read the data out of database and then save it in a text file.

How can I do that in Ruby? Is there any file management system in Ruby?

8 Answers 8

996

Are you looking for the following?

File.open(yourfile, 'w') { |file| file.write("your text") } 
Sign up to request clarification or add additional context in comments.

12 Comments

yourfile is a variable that holds the name of the file to be written.
Alternatively: f = File.open('name','w'); f.write('text'); f.close
@vish: I wouldn't recommend this solution as the file descriptor would be left open if f.write raises an Exception.
Short and sweet: File.write('filename', 'content')
Even shorter and documented: IO.write('filename', 'content')
|
772

You can use the short version:

File.write('/path/to/file', 'Some glorious content') 

It returns the length written; see ::write for more details and options.

To append to the file, if it already exists, use:

File.write('/path/to/file', 'Some glorious content', mode: 'a') 

9 Comments

FYI this shorthand method only works beginning with Ruby 1.9.3. There is, no such method in any earlier versions of 1.9 or 1.8. In that case you must use the longer block method posted by @mvndaai
FYI this does properly close the file when finished.
IO class docs say it does close the file
Will this append to a file or just overwrite it?
@JoshPinter: it overwrites.
|
270

This is preferred approach in most cases:

 File.open(yourfile, 'w') { |file| file.write("your text") } 

When a block is passed to File.open, the File object will be automatically closed when the block terminates.

If you don't pass a block to File.open, you have to make sure that file is correctly closed and the content was written to file.

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 

You can find it in 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; } 

6 Comments

Yes, using the block syntax with { |file| .... } will close the file when the block closes.
Cool, thanks. I wasn't sure about that. Here's some more info about blocks and File.open blog.rubybestpractices.com/posts/rklemme/… it's also mentioned in the official documentation
Just something ruby way-ish: nil is an object, so to check if a file is null, you ask the object itself instead of comparing (file.nil? instead of file == nil)
@JCabello sure, that's definitely more Ruby-like approach, thanks!
finally an answer that shows that one should also check for file status and how to handle it, and not just one liner that just shows the open call.
|
194

The Ruby File class will give you the ins and outs of ::new and ::open but its parent, the IO class, gets into the depth of #read and #write.

6 Comments

Thanks @Geoff. It's good to see new users cleaning up outdated questions and answers. Makes for a better site overall.
I find this ironic. The answer is very well documented... but now a year later, this question is the first hit on Google. When the question was asked, it may have seemed that the OP was dedicating little effort but now as far as Google is concerned, this is the best source.
Probably because everything you really need to know is here. Mine is the "teach a man to fish" answer for those who want to read the finer details, and there are plenty of "give a man a fish" answers here as well for people who just want to cut-and-paste. It's not surprising that this combination ends up well ranked on Google.
So, in fairness, I work in a lot of different languages, which means I rarely get around to remembering the syntax for any specific one. I've googled this a few times, and I always scroll right past this answer, to the one below it, because when I google StackOverflow I'm usually just looking for a dang fish. :p Honestly tho it's good having both. Perhaps someday I will be doing enough Ruby all at once that I will care about the details.
This does not answer the question. It merely points to the two classes that contain most of the methods for doing I/O, and makes no mention of the connection with the database. That would be fine as a comment, but hardly qualifies as an answer. I realise that the OP and the many readers who upvoted this answer disagree, and I frankly don't understand what they were thinking.
|
119

Zambri's answer found here is the best.

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

where your options for <OPTION> are:

r - Read only. The file must exist.

w - Create an empty file for writing.

a - Append to a file.The file is created if it does not exist.

r+ - Open a file for update both reading and writing. The file must exist.

w+ - Create an empty file for both reading and writing.

a+ - Open a file for reading and appending. The file is created if it does not exist.

In your case, w is preferable.

1 Comment

@CarySwoveland I actually agree with you. The real problem is that one of the two questions should have been marked as a duplicate a long time ago. I copied the answer because once I found the question zanbri had answered and the next few times when I needed the same info I came across this question first and had to figure out how to get to the other question. Eventually, I thought it would just be easier to have his answer here as well. I linked to his answer so hopefully, people would click over and give him an upvote as well.
38

For those of us that learn by example...

Write text to a file like this:

IO.write('/tmp/msg.txt', 'hi') 

BONUS INFO ...

Read it back like this

IO.read('/tmp/msg.txt') 

Frequently, I want to read a file into my clipboard ***

Clipboard.copy IO.read('/tmp/msg.txt') 

And other times, I want to write what's in my clipboard to a file ***

IO.write('/tmp/msg.txt', Clipboard.paste) 

*** Assumes you have the clipboard gem installed

See: https://rubygems.org/gems/clipboard

2 Comments

Beware the IO.write option overwrite the file content instead of append. Append with IO.write is a bit tedious.
Not sure what you're talking about? The IO.write command does not need that option to write to a file. I would be careful to either save the file to the /tmp directory or the current directory; Otherwise, you might see a Errno::ENOENT: No such file or directory @ rb_sysopen message and the file created with a size of 0 bytes.
29

To destroy the previous contents of the file, then write a new string to the file:

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

To append to a file without overwriting its old contents:

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

Comments

0

While this answer has many variants of opening a file and writing to it from a block there is no answer of how someone who came from C or Perl or Python might do it in a familiar way.

In the block variant, all the text written or read needs to be local to the block. The file is opened, written to, and closed in one block of code:

File.open('/tmp/test.txt', 'w'){|f| f << "Living the block life"} # closed automatically at the end # the file handle is no longer available 

In C, you would open a file this way:

FILE* fptr; fptr = fopen("/tmp/test.txt", "w"); if (fptr == NULL) { printf(error_msg); exit(-1); } # continue with your file # close when done. IMPORTANT because C can buffer and lose data if not closed fclose(fptr) 

In Perl, kinda similar:

open(FH, '>', '/tmp/test.txt') or die $!; # ^ this is write # you need to close FH explicitly 

In Python, you can have both C style open / use / explicit close:

f = open("/tmp/test.txt", "w") # can write to f but you need to close f explicitly f.close() 

Python also has with blocks that are similar to Ruby's block open / explicit close:

with open("/tmp/test.txt", "w") as f: # do your writing # when f goes out of scope, at the bottom file is automatically closed 

If you want C style file open / explicit close in Ruby:

f=File.open('/tmp/test.txt', 'w') # If that cannot be opened, Ruby's default behavior is equivalent # to Perl's open(FH, '>', '/tmp/test.txt') or die $!; # File.open errors can be rescued also # f needs to be explicitly closed like so: f.close 

Why would you want this? Suppose you have:

f=File.open('/tmp/test.txt', 'w') # rescue if used # ... # Things that don't fit in a block that need that file f.puts(something) # ... f.close 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.