Rubyでファイルに書き込む方法は?


572

データベースからデータを読み取り、テキストファイルに保存する必要があります。

Rubyではどうすればよいですか?Rubyにファイル管理システムはありますか?

回答:


179

RubyのFileクラスは、あなたのインとアウトを与えるだろう::newし、::openしかしその親、IOクラスは、の深さになる#read#write


6
@Geoffに感謝します。新しいユーザーが古い質問と回答をクリーンアップするのを見るのは良いことです。全体的に良いサイトになります。
jdl 2012年

7
私はこの皮肉を見つけます。答えは非常によく文書化されています...しかし、1年後の今、この質問はGoogleで最初にヒットしました。質問が出されたとき、OPはほとんど努力を払っていなかったように見えたかもしれませんが、今のところGoogleに関する限り、これが最良の情報源です。
ジェフ

7
あなたが本当に知る必要があるすべてがここにあるからでしょう。私のことは、詳細を読みたい人には「人に魚を教える」という答えであり、カットアンドペーストしたい人にも「人に魚を与える」という答えがたくさんあります。この組み合わせが最終的にGoogleで上位にランクされることは当然のことです。
jdl 2013

1
ですから、公平に言うと、私は多くの異なる言語で作業しています。つまり、特定の言語の構文を覚えていることはほとんどありません。私はこれを何度かグーグルで検索しました。常にStackOverflowをグーグルするとき、私はただくどい魚を探しているので、常にこの答えのすぐ下をスクロールしてその下の答えまでスクロールします。:p正直なところ、両方を持っているのは良いことです。たぶん、いつか十分なRubyを一気にやって、詳細に気を配るでしょう。
user435779

2
これは質問の答えにはなりません。これは、I / Oを実行するためのほとんどのメソッドを含む2つのクラスを指すだけであり、データベースとの接続については言及していません。これはコメントとしては問題ありませんが、回答としての資格はほとんどありません。OPとこの回答に賛成した多くの読者が同意していないことを理解しています。率直に言って、彼らが何を考えていたか理解できません。
Cary Swoveland

929

以下をお探しですか?

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

8
yourfile書き込むファイルの名前を保持する変数です。
Bセブン

17
または、f = File.open( 'name'、 'w'); f.write( 'テキスト'); f.close
vish

5
@vish:f.write例外が発生した場合、ファイル記述子は開いたままになるため、このソリューションはお勧めしません。
nbarraille 2013年

289
短くて甘い:File.write('filename', 'content')
Benjamin Oakes

14
さらに短く文書化された:IO.write('filename', 'content')
タイ語

636

あなたは短いバージョンを使うことができます:

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

書き込まれた長さを返します。詳細とオプションについては、:: writeを参照してください。

ファイルに追加するには、ファイルが既に存在する場合は、次を使用します。

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

14
ちなみに、この省略メソッドはRuby 1.9.3以降でのみ機能します。1.9または1.8の以前のバージョンには、そのような方法はありません。その場合は、@ mvndaaiが投稿したより長いブロックメソッドを使用する必要があります
Andrew Burns

13
参考までに、これは終了時にファイルを適切に閉じます。
Freedom_Ben 2014

2
IOクラスのドキュメントは、ファイルを閉じると言っています
nruth

7
これはファイルに追加されますか、それとも単に上書きしますか?
Joshua Pinter 2015年

8
@JoshPinter:上書きします。
mklement0

248

これは、ほとんどの場合に推奨されるアプローチです。

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

ブロックがに渡されるFile.openと、ブロックが終了するとFileオブジェクトは自動的に閉じられます。

ブロックを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

あなたはそれをドキュメントで見つけることができます:

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 |でブロック構文を使用します ....}は、ブロックが閉じるときにファイルを閉じます。
wesgarrison 2013

よろしくお願いします。それについてはよくわかりませんでした。ブロックとFile.open blog.rubybestpractices.com/posts/rklemme/についての詳細は次のとおりです。公式ドキュメントにも記載されています
Tombart

1
ただルビー的な方法:nilはオブジェクトなので、ファイルがnullかどうかを確認するには、比較する代わりにオブジェクト自体に問い合わせます(file == nilの代わりにfile.nil?)
JCabello

@JCabello確かに、これは間違いなくRubyのようなアプローチです。
トンバート

最後に、オープンコールを示す1つのライナーだけでなく、ファイルのステータスとその処理方法も確認する必要があることを示す回答。
Nasser 2015年

115

ここにあるZambriの答え一番です。

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

オプション<OPTION>は次のとおりです。

r-読み取り専用。ファイルが存在している必要があります。

w -書き込み用に空のファイルを作成します。

a -ファイルに追加します。ファイルが存在しない場合は作成されます。

r+-読み取りと書き込みの両方を更新するためにファイルを開きます。ファイルが存在している必要があります。

w+ -読み取りと書き込みの両方に空のファイルを作成します。

a+-読み取りと追加のためにファイルを開きます。ファイルが存在しない場合は作成されます。

あなたのケースでwは、好ましいです。


確かに別の回答をコピーした回答が100を超える賛成票を受け取る可能性があることには驚かされます。最初の文を質問へのコメントとして投稿することはできますが、それだけです。
Cary Swoveland

@CarySwoveland私は実際にあなたに同意します。本当の問題は、2つの質問の1つがずっと前に重複としてマークされていたはずであるということです。質問を見つけたらzanbriが答え、次の数回は同じ情報が必要なときにこの質問に出くわし、他の質問に行く方法を見つけなければならなかったので、私は答えをコピーしました。結局、ここでも彼の答えがある方が簡単だと思いました。私は彼の答えにリンクしたので、うまくいけば、人々はクリックして彼にも賛成票を与えるでしょう。
mvndaai

31

例によって学ぶ私たちのために...

次のようにテキストをファイルに書き込みます。

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


1
追加ではなく、ファイルの内容を上書きするIO.writeオプションに注意してください。Append with IO.writeは少し面倒です。
fguillen 2016年

何のことかわからない?IO.writeコマンドは、ファイルに書き込むためにそのオプションを必要としません。/ tmpディレクトリまたは現在のディレクトリにファイルを保存するように注意します。そうしないErrno::ENOENT: No such file or directory @ rb_sysopenと、メッセージと、サイズが0バイトで作成されたファイルが表示される場合があります。
l3x 2017年

25

ファイルの以前の内容を破棄するには、ファイルに新しい文字列を書き込みます。

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

古いコンテンツを上書きせずにファイルに追加するには:

open('myfile.txt', "a") { |f| f << 'I am appended string' } 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.