Ruby'de dosyaya nasıl yazılır?


572

Veritabanından veri okumak ve daha sonra bir metin dosyasına kaydetmek gerekir.

Bunu Ruby'de nasıl yapabilirim? Ruby'de herhangi bir dosya yönetim sistemi var mı?

Yanıtlar:


179

Yakut File sınıfı size ins ve çıkışları verecek ::newve ::openancak ebeveyn, IO sınıfını derinliği içine alır #readve #write.


6
Teşekkürler @ Geoff. Yeni kullanıcıların eski soruları ve cevaplarını temizlediğini görmek güzel. Genel olarak daha iyi bir site yapar.
jdl

7
Bu ironik buluyorum. Cevap çok iyi belgelenmiştir ... ancak şimdi bir yıl sonra, bu soru Google'daki ilk hit. Soru sorulduğunda, OP'nin çok az çaba sarfettiği görülmüş olabilir, ancak şimdi Google söz konusu olduğunda, bu en iyi kaynaktır.
Jeff

7
Muhtemelen bilmeniz gereken her şey burada. Benimki, ince ayrıntıları okumak isteyenler için "bir insana balık tutmayı öğretin" cevabıdır ve burada sadece kesip yapıştırmak isteyen insanlar için birçok "insana balık ver" yanıtı vardır. Bu kombinasyonun Google'da üst sıralarda yer alması şaşırtıcı değil.
jdl

1
Yani, adalet içinde, birçok farklı dilde çalışıyorum, yani herhangi bir sözdiziminin sözdizimini hatırlamak için nadiren dolaşıyorum. Ben bunu birkaç kez googled ve ben de hep kaydırma sağ geçmiş bu cevap, ben StackOverflow google zaman genellikle sadece bir dang balık arıyorum çünkü bunun altındaki birine. : p Dürüst olmak gerekirse her ikisine de sahip olmak iyidir. Belki bir gün ayrıntıları bir anda önemsediğim kadar Ruby yapacağım.
user435779

2
Bu soruya cevap vermiyor. Yalnızca G / Ç yapmak için yöntemlerin çoğunu içeren iki sınıfa işaret eder ve veritabanı ile bağlantıdan bahsetmez. Bu bir yorum olarak iyi olurdu, ancak cevap olarak nitelendirilemez. OP ve bu cevabı iptal eden pek çok okurun aynı fikirde olmadığını ve ne düşündüklerini açık bir şekilde anlamıyorum.
Cary Swoveland

929

Aşağıdakileri mi arıyorsunuz?

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

8
yourfile, yazılacak dosyanın adını tutan bir değişkendir.
B Seven

17
Alternatif olarak: f = File.open ('ad', 'w'); f.write (text '); f.close
vish

5
@vish: Bir istisna ortaya çıkarırsa dosya tanımlayıcı açık bırakılacağı için bu çözümü önermem f.write.
nbarraille

288
Kısa ve tatlı:File.write('filename', 'content')
Benjamin Oakes

14
Daha da kısa ve belgelenmiş:IO.write('filename', 'content')
Tayca

636

Kısa sürümü kullanabilirsiniz:

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

Yazılan uzunluğu döndürür; bkz :: yazma Daha fazla bilgi ve seçenekler için.

Dosyaya eklemek için, zaten varsa, şunu kullanın:

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

14
Bu kısayol yöntemi yalnızca Ruby 1.9.3 ile başlayarak çalışır. 1.9 veya 1.8'in önceki sürümlerinde böyle bir yöntem yoktur. Bu durumda, @mvndaai tarafından yayınlanan daha uzun blok yöntemini kullanmalısınız
Andrew Burns

13
Bilginize, bu işlem bittiğinde dosyayı düzgün şekilde kapatmaz.
Freedom_Ben

2
IO sınıfı dokümanlar dosyayı kapattığını söylüyor
nruth

7
Bu bir dosyaya eklenecek mi yoksa sadece üzerine mi yazılacak?
Joshua Pinter

8
@ JoshPinter: Üzerine yazıyor.
mklement0

248

Çoğu durumda bu tercih edilen yaklaşımdır:

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

Bir blok iletildiğinde File.open, blok sona erdiğinde File nesnesi otomatik olarak kapatılır.

Bir bloğu File.openiletmezseniz, dosyanın doğru bir şekilde kapatıldığından ve içeriğin dosyaya yazıldığından emin olmanız gerekir.

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

Belgelerde bulabilirsiniz :

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

Evet, blok sözdizimini {| file | ....} blok kapandığında dosyayı kapatır.
wesgarrison

Harika, teşekkürler. Bundan emin değildim. İşte blokları hakkında biraz daha bilgi var ve File.open blog.rubybestpractices.com/posts/rklemme/... aynı zamanda resmi belgelerinde belirtilen oluyor
Tombart

1
Sadece bir şey ruby ​​way-ish: nil bir nesnedir, bu nedenle bir dosyanın boş olup olmadığını kontrol etmek için, karşılaştırmak yerine nesnenin kendisine sormanız gerekir (file == nil yerine file.nil?)
JCabello

@JCabello emin, bu kesinlikle daha Ruby benzeri bir yaklaşım, teşekkürler!
Tombart

son olarak, sadece açık çağrıyı gösteren tek bir lineri değil, bir kişinin dosya durumunu ve nasıl ele alınacağını da kontrol etmesi gerektiğini gösteren bir cevap.
Nasser

115

Zambri'nin cevabı burada bulundu en iyisidir.

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

için seçenekleriniz <OPTION>:

r- Sadece oku. Dosya mevcut olmalıdır.

w - Yazmak için boş bir dosya oluşturun.

a - Dosyaya ekle. Dosya yoksa oluşturulur.

r+- Hem okuma hem de yazma için bir dosya açın. Dosya mevcut olmalıdır.

w+ - Hem okuma hem de yazma için boş bir dosya oluşturun.

a+- Okumak ve eklemek için bir dosya açın. Dosya yoksa oluşturulur.

Sizin durumunuzda, wtercih edilir.


Kuşkusuz, başka bir yanıtı kopyalayan bir cevap 100'den fazla oy alabilir. İlk cümleyi soru üzerine yorum olarak görebilirim, ama hepsi bu.
Cary Swoveland

@CarySwoveland Aslında sana katılıyorum. Asıl sorun, iki sorudan birinin uzun zaman önce tekrar olarak işaretlenmiş olması gerektiğidir. Cevabı kopyaladım çünkü zanbri'nin cevapladığı soruyu bulduğumda ve sonraki birkaç kez aynı bilgiye ihtiyaç duyduğumda önce bu soruya rastladım ve diğer soruya nasıl ulaşacağımı bulmak zorunda kaldım. Sonunda, cevabını burada da almanın daha kolay olacağını düşündüm. Onun cevabına o kadar umut verdim ki, insanlar tıklayıp ona bir oy verecekti.
mvndaai

31

Örnek olarak öğrenenler için ...

Aşağıdaki gibi bir dosyaya metin yazın:

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

İLAVE BİLGİ ...

Bu şekilde tekrar okuyun

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

Sık sık panomuza bir dosya okumak istiyorum ***

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

Ve diğer zamanlarda, panomdaki dosyaları bir dosyaya yazmak istiyorum ***

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

*** Pano mücevher yüklü olduğunu varsayar

Bkz. Https://rubygems.org/gems/clipboard


1
Ekle yerine dosya içeriğinin üzerine yazmaIO.write seçeneğine dikkat edin . IO.write ile biraz sıkıcı.
fguillen

Neden bahsettiğinizden emin değil misiniz? IO.write komutunun bir dosyaya yazmak için bu seçeneğe ihtiyacı yoktur. / Tmp dizinine veya geçerli dizine dosyayı kaydetmek için dikkatli olun; Aksi takdirde, bir Errno::ENOENT: No such file or directory @ rb_sysopenmesaj ve 0 bayt boyutunda oluşturulan dosyayı görebilirsiniz .
l3x

25

Dosyanın önceki içeriğini yok etmek için, dosyaya yeni bir dize yazın:

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

Eski içeriğinin üzerine yazmadan bir dosyaya eklemek için:

open('myfile.txt', "a") { |f| f << 'I am appended string' } 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.