Bagaimana cara menulis ke file di Ruby?


572

Saya perlu membaca data dari database dan kemudian menyimpannya dalam file teks.

Bagaimana saya bisa melakukannya di Ruby? Apakah ada sistem manajemen file di Ruby?

Jawaban:


179

Kelas File Ruby akan memberi Anda seluk beluk ::newdan ::opentetapi induknya, kelas IO , masuk ke kedalaman #readdan #write.


6
Terima kasih @ Geoff. Adalah baik untuk melihat pengguna baru membersihkan pertanyaan dan jawaban yang sudah ketinggalan zaman. Membuat situs yang lebih baik secara keseluruhan.
jdl

7
Saya menemukan ini ironis. Jawabannya didokumentasikan dengan sangat baik ... tetapi sekarang setahun kemudian, pertanyaan ini adalah hit pertama di Google. Ketika pertanyaan diajukan, mungkin terlihat bahwa OP mendedikasikan sedikit usaha tetapi sekarang sejauh yang menyangkut Google, ini adalah sumber terbaik.
Jeff

7
Mungkin karena semua yang perlu Anda ketahui ada di sini. Milik saya adalah jawaban "ajarlah seorang pria untuk menangkap ikan" bagi mereka yang ingin membaca perincian yang lebih baik, dan ada banyak jawaban "beri seorang ikan untuk seorang pria" di sini juga untuk orang-orang yang hanya ingin memotong dan menempel. Tidak mengherankan bahwa kombinasi ini berakhir dengan peringkat baik di Google.
jdl

1
Jadi, dalam keadilan, saya bekerja dalam banyak bahasa yang berbeda, yang berarti saya jarang bisa mengingat sintaks untuk bahasa tertentu. Saya sudah googled ini beberapa kali, dan saya selalu menggulir melewati jawaban ini, ke yang di bawahnya, karena ketika saya google StackOverflow saya biasanya hanya mencari ikan dang. : p Jujur saja, ada baiknya memiliki keduanya. Mungkin suatu hari nanti saya akan melakukan cukup Ruby sekaligus sehingga saya akan peduli dengan detailnya.
user435779

2
Ini tidak menjawab pertanyaan. Ini hanya menunjuk ke dua kelas yang berisi sebagian besar metode untuk melakukan I / O, dan tidak menyebutkan koneksi dengan database. Itu akan baik-baik saja sebagai komentar, tetapi hampir tidak memenuhi syarat sebagai jawaban. Saya menyadari bahwa OP dan banyak pembaca yang mengangkat jawaban ini tidak setuju, dan saya terus terang tidak mengerti apa yang mereka pikirkan.
Cary Swoveland

929

Apakah Anda mencari yang berikut ini?

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

8
yourfileadalah variabel yang menyimpan nama file yang akan ditulis.
B Seven

17
Atau: f = File.open ('name', 'w'); f.write ('text'); f.close
vish

5
@vish: Saya tidak akan merekomendasikan solusi ini karena file descriptor akan dibiarkan terbuka jika f.writememunculkan Exception.
nbarraille

289
Singkat dan manis:File.write('filename', 'content')
Benjamin Oakes

14
Bahkan lebih pendek dan terdokumentasi:IO.write('filename', 'content')
Thailand

636

Anda dapat menggunakan versi singkat:

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

Ini mengembalikan panjang yang ditulis; lihat :: tulis untuk detail dan opsi lebih lanjut.

Untuk menambahkan file, jika sudah ada, gunakan:

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

14
FYI metode singkat ini hanya bekerja dimulai dengan Ruby 1.9.3. Tidak ada metode seperti itu di versi 1.9 atau 1.8 sebelumnya. Dalam hal ini Anda harus menggunakan metode blok lagi yang diposting oleh @mvndaai
Andrew Burns

13
FYI ini benar menutup file ketika selesai.
Freedom_Ben

2
Dokumen kelas IO mengatakan file itu tidak ditutup
nruth

7
Apakah ini akan ditambahkan ke file atau hanya ditimpa?
Joshua Pinter

8
@ JoshPinter: itu menimpa.
mklement0

248

Ini adalah pendekatan yang lebih disukai dalam kebanyakan kasus:

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

Ketika blok dilewatkan ke File.open, objek File akan ditutup secara otomatis ketika blok berakhir.

Jika Anda tidak meneruskan blokir File.open, Anda harus memastikan bahwa file ditutup dengan benar dan konten ditulis ke 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

Anda dapat menemukannya di dokumentasi :

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;
}

Ya, menggunakan sintaks blok dengan {| file | ....} akan menutup file ketika blok ditutup.
wesgarrison

Keren Terimakasih. Saya tidak yakin tentang itu. Berikut ini beberapa info lebih lanjut tentang blok dan File.open blog.rubybestpractices.com/posts/rklemme/… itu juga disebutkan dalam dokumentasi resmi
Tombart

1
Hanya sesuatu yang ruby ​​way-ish: nil adalah objek, jadi untuk memeriksa apakah file itu nol, Anda bertanya objek itu sendiri alih-alih membandingkan (file.nil? Bukan file == nil)
JCabello

@JCabello yakin, itu pasti pendekatan yang lebih mirip Ruby, terima kasih!
Tombart

akhirnya jawaban yang menunjukkan bahwa seseorang juga harus memeriksa status file dan cara menanganinya, dan bukan hanya satu liner yang hanya menunjukkan panggilan terbuka.
Nasser

115

Jawaban Zambri yang ditemukan di sini adalah yang terbaik.

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

tempat pilihan Anda <OPTION>adalah:

r- Baca saja. File harus ada.

w - Buat file kosong untuk menulis.

a - Tambahkan ke file. File ini dibuat jika tidak ada.

r+- Buka file untuk memperbarui membaca dan menulis. File harus ada.

w+ - Buat file kosong untuk membaca dan menulis.

a+- Buka file untuk membaca dan menambahkan. File dibuat jika tidak ada.

Dalam kasus Anda, wlebih disukai.


Saya terkejut bahwa jawaban yang diakui menyalin jawaban lain dapat menerima lebih dari 100 suara positif. Saya bisa melihat memposting kalimat pertama sebagai komentar pada pertanyaan, tapi hanya itu.
Cary Swoveland

@CarySwoveland Saya sebenarnya setuju dengan Anda. Masalah sebenarnya adalah bahwa salah satu dari dua pertanyaan seharusnya sudah ditandai sebagai duplikat lama. Saya menyalin jawaban itu karena begitu saya menemukan pertanyaan yang dijawab zanbri dan beberapa kali berikutnya ketika saya membutuhkan informasi yang sama saya pertama-tama menemukan pertanyaan ini dan harus mencari cara untuk mendapatkan pertanyaan lainnya. Akhirnya, saya pikir akan lebih mudah untuk mendapatkan jawabannya di sini juga. Saya ditautkan ke jawabannya sehingga mudah-mudahan, orang-orang akan mengklik dan memberinya upvote juga.
mvndaai

31

Bagi kita yang belajar dengan contoh ...

Tulis teks ke file seperti ini:

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

INFO BONUS ...

Baca kembali seperti ini

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

Seringkali, saya ingin membaca file di clipboard saya ***

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

Dan di lain waktu, saya ingin menulis apa yang ada di clipboard saya ke file ***

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

*** Mengasumsikan Anda memiliki permata clipboard diinstal

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


1
Waspadai IO.writeopsi menimpa konten file alih-alih menambahkan. Tambahkan dengan IO.write agak membosankan.
fguillen

Tidak yakin apa yang Anda bicarakan? Perintah IO.write tidak memerlukan opsi itu untuk menulis ke file. Saya akan berhati-hati untuk menyimpan file ke direktori / tmp atau direktori saat ini; Jika tidak, Anda mungkin melihat Errno::ENOENT: No such file or directory @ rb_sysopenpesan dan file dibuat dengan ukuran 0 byte.
13x

25

Untuk memusnahkan konten file sebelumnya, lalu tulis string baru ke file:

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

Untuk menambahkan file tanpa menimpa konten lamanya:

open('myfile.txt', "a") { |f| f << 'I am appended string' } 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.