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?

ohana
sumber

Jawaban:

179

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

jdl
sumber
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") }
Todd R
sumber
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')
Sébastien Le Callonnec
sumber
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;
}
Tombart
sumber
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.

mvndaai
sumber
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

l3x
sumber
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' } 
Marko Tunjic
sumber