Come scrivere sul file in Ruby?


572

Devo leggere i dati dal database e quindi salvarli in un file di testo.

Come posso farlo in Ruby? Esiste un sistema di gestione dei file in Ruby?

Risposte:


179

La classe File Ruby ti fornirà i dettagli di ::newe, ::openma il suo genitore, la classe IO , entra nella profondità di #reade #write.


6
Grazie @Geoff. È bello vedere i nuovi utenti ripulire domande e risposte obsolete. Rende complessivamente un sito migliore.
jdl,

7
Lo trovo ironico. La risposta è ben documentata ... ma ora un anno dopo, questa domanda è il primo successo su Google. Quando è stata posta la domanda, può sembrare che il PO stia dedicando pochi sforzi, ma ora per quanto riguarda Google, questa è la migliore fonte.
Jeff,

7
Probabilmente perché tutto ciò che devi veramente sapere è qui. La mia è la risposta "insegnare a un uomo a pescare" per coloro che vogliono leggere i dettagli più precisi, e ci sono molte risposte "dare a un uomo un pesce" anche qui per le persone che vogliono solo tagliare e incollare. Non sorprende che questa combinazione finisca bene classificata su Google.
jdl

1
Quindi, in tutta onestà, lavoro in molte lingue diverse, il che significa che raramente riesco a ricordare la sintassi per una specifica. Ho cercato su Google alcune volte, e scorro sempre oltre questa risposta, a quella sotto di essa, perché quando google StackOverflow di solito cerco solo un pesce di pericolo. : p Onestamente però è bello avere entrambi. Forse un giorno farò abbastanza Ruby in una volta sola che mi prenderò cura dei dettagli.
user435779

2
Questo non risponde alla domanda. Indica semplicemente le due classi che contengono la maggior parte dei metodi per eseguire l'I / O e non menziona la connessione con il database. Va bene come commento, ma difficilmente si qualifica come una risposta. Mi rendo conto che l'OP e i molti lettori che hanno votato questa risposta non sono d'accordo, e francamente non capisco cosa stessero pensando.
Cary Swoveland,

929

Stai cercando il seguente?

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

8
yourfileè una variabile che contiene il nome del file da scrivere.
B Seven,

17
In alternativa: f = File.open ('name', 'w'); f.write ( 'testo'); f.close
vish

5
@vish: non consiglierei questa soluzione poiché il descrittore di file verrebbe lasciato aperto se si f.writesolleva un'eccezione.
nbarraille,

289
Breve e dolce:File.write('filename', 'content')
Benjamin Oakes,

14
Ancora più breve e documentato:IO.write('filename', 'content')
Thai

636

Puoi usare la versione breve:

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

Restituisce la lunghezza scritta; vedi :: scrivi per maggiori dettagli e opzioni.

Per aggiungere al file, se esiste già, utilizzare:

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

14
Cordiali saluti, questo metodo abbreviato funziona solo a partire da Ruby 1.9.3. Non esiste un metodo simile in nessuna versione precedente di 1.9 o 1.8. In tal caso è necessario utilizzare il metodo del blocco più lungo pubblicato da @mvndaai
Andrew Burns,

13
Cordiali saluti, questo chiude correttamente il file al termine.
Freedom_Ben,

2
I documenti di classe IO dicono che chiude il file
nruth

7
Questa aggiunta a un file o semplicemente lo sovrascriverà?
Joshua Pinter

8
@JoshPinter: sovrascrive.
mklement0,

248

Questo è l'approccio preferito nella maggior parte dei casi:

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

Quando viene passato un blocco File.open, l'oggetto File verrà automaticamente chiuso al termine del blocco.

Se non si passa un blocco a File.open, è necessario assicurarsi che il file sia chiuso correttamente e che il contenuto sia stato scritto nel 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

Puoi trovarlo nella documentazione :

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

Sì, utilizzando la sintassi del blocco con {| file | ....} chiuderà il file alla chiusura del blocco.
Wesgarrison,

Figo, grazie. Non ne ero sicuro. Ecco alcune ulteriori informazioni sui blocchi e File.open blog.rubybestpractices.com/posts/rklemme/… è anche menzionato nella documentazione ufficiale
Tombart,

1
Solo qualcosa di rubino: nil è un oggetto, quindi per verificare se un file è nullo, chiedi all'oggetto stesso invece di confrontare (file.nil? Invece di file == nil)
JCabello

@JCabello certo, questo è sicuramente un approccio più simile a quello di Ruby, grazie!
Tombart,

infine una risposta che mostra che si dovrebbe anche controllare lo stato del file e come gestirlo, e non solo un liner che mostra solo la chiamata aperta.
Nasser,

115

La risposta di Zambri trovata qui è la migliore.

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

dove sono le tue opzioni <OPTION>:

r- Sola lettura. Il file deve esistere.

w - Crea un file vuoto per la scrittura.

a - Aggiungi a un file. Il file viene creato se non esiste.

r+- Apri un file per l'aggiornamento sia in lettura che in scrittura. Il file deve esistere.

w+ - Crea un file vuoto sia per la lettura che per la scrittura.

a+- Apri un file per la lettura e l'aggiunta. Il file viene creato se non esiste.

Nel tuo caso, wè preferibile.


Sono sconcertato che una risposta che, certamente, copia un'altra risposta potrebbe ricevere oltre 100 voti. Vedo pubblicare la prima frase come un commento sulla domanda, ma è tutto.
Cary Swoveland,

@CarySwoveland Sono davvero d'accordo con te. Il vero problema è che una delle due domande avrebbe dovuto essere contrassegnata come duplicata molto tempo fa. Ho copiato la risposta perché una volta trovata la domanda a cui zanbri aveva risposto e le successive volte in cui avevo bisogno delle stesse informazioni, mi sono imbattuto prima in questa domanda e ho dovuto capire come arrivare all'altra domanda. Alla fine, ho pensato che sarebbe stato più semplice avere la sua risposta anche qui. Mi sono collegato alla sua risposta così, si spera, la gente farebbe clic sopra e gli darebbe anche un voto.
mvndaai,

31

Per quelli di noi che imparano con l'esempio ...

Scrivi il testo in un file come questo:

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

INFORMAZIONI BONUS ...

Rileggilo in questo modo

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

Spesso, voglio leggere un file negli appunti ***

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

E altre volte, voglio scrivere ciò che è nei miei appunti in un file ***

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

*** Suppone che tu abbia installato la gemma degli appunti

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


1
Attenzione IO.writeall'opzione sovrascrivere il contenuto del file anziché aggiungere. Aggiungere con IO.write è un po 'noioso.
fguillen,

Non sei sicuro di cosa stai parlando? Il comando IO.write non ha bisogno di quell'opzione per scrivere su un file. Starei attento a salvare il file nella directory / tmp o nella directory corrente; Altrimenti, potresti visualizzare un Errno::ENOENT: No such file or directory @ rb_sysopenmessaggio e il file creati con una dimensione di 0 byte.
lxx

25

Per distruggere il contenuto precedente del file, quindi scrivere una nuova stringa nel file:

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

Per aggiungere a un file senza sovrascrivere i suoi vecchi contenuti:

open('myfile.txt', "a") { |f| f << 'I am appended string' } 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.