2010-05-06 5 views
450

Je dois lire les données dans la base de données, puis les enregistrer dans un fichier texte.Comment écrire au fichier dans Ruby?

Comment puis-je faire cela dans Ruby? Y a-t-il un système de gestion de fichiers dans Ruby?

Répondre

153

Le Ruby File class vous donnera les tenants et les aboutissants de ::new et ::open mais son parent, le IO class, pénètre dans la profondeur de #read et #write.

+5

Merci @Geoff. Il est bon de voir de nouveaux utilisateurs nettoyer des questions et réponses périmées. Fait pour un meilleur site global. – jdl

+5

Je trouve cela ironique. La réponse est très bien documentée ... mais un an plus tard, cette question est la première sur Google. Quand la question a été posée, il a pu sembler que le PO consacrait peu d'efforts mais maintenant, en ce qui concerne Google, c'est la meilleure source. – Jeff

+6

Probablement parce que tout ce que vous avez vraiment besoin de savoir est ici. La mienne est la réponse «enseigner à un homme à pêcher» pour ceux qui veulent lire les détails les plus fins, et il y a beaucoup de réponses «donner un poisson à un homme» ici aussi pour ceux qui veulent simplement couper-coller. Il n'est pas surprenant que cette combinaison se retrouve bien classée sur Google. – jdl

786

Vous cherchez ce qui suit?

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

Renvoie probablement le nombre de caractères affectés. J'ai besoin d'un objet fichier en retour. Des idées? – Prem

+5

'yourfile' est une variable qui contient le nom du fichier à écrire. –

+11

Alternativement: f = File.open ('nom', 'w'); f.write ('texte'); f.close – vish

211

Cette approche est préférable dans la plupart des cas:

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

Lorsqu'un bloc est passé à File.open, l'objet fichier sera fermé automatiquement lorsque le bloc se termine.

Si vous ne passez pas un bloc à File.open, vous devez vous assurer que le fichier est correctement fermé et que le contenu a été écrit dans un fichier.

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 

Vous pouvez le trouver dans documentation:

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

Oui, en utilisant la syntaxe du bloc avec {| file | ....} fermera le fichier lorsque le bloc se ferme. – wesgarrison

+0

Cool, merci. Je n'étais pas sûr à ce sujet. Voici quelques informations sur les blocs et sur 'File.open' http://blog.rubybestpractices.com/posts/rklemme/001-Using_blocks_for_Robustness.html il est aussi mentionné dans la documentation officielle – Tombart

+1

Juste quelque chose ruby ​​way-ish: nil est un objet, donc pour vérifier si un fichier est nul, vous demandez l'objet lui-même au lieu de comparer (fichier.nil? au lieu de fichier == nil) – JCabello

99

de réponse found hereZambri est le meilleur.

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

où vos options pour <OPTION> sont:

r - Lecture seule. Le fichier doit exister.

w - Créer un fichier vide pour l'écriture.

a - Ajout à un fichier. Le fichier est créé s'il n'existe pas.

r+ - Ouvrir un fichier pour la mise à jour à la fois en lecture et en écriture. Le fichier doit exister.

w+ - Créez un fichier vide pour la lecture et l'écriture.

a+ - Ouvre un fichier pour lecture et ajout. Le fichier est créé s'il n'existe pas. Dans votre cas, w est préférable.

476

Vous pouvez utiliser la version courte:

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

Il retourne la longueur écrite; Voir ::write pour plus de détails et d'options.

+13

FYI cette méthode sténographique ne fonctionne qu'à partir de Ruby 1.9.3. Il n'y a pas de telle méthode dans les versions antérieures de 1.9 ou 1.8. Dans ce cas, vous devez utiliser la méthode de blocage plus longue publiée par @mvndaai –

+7

FYI cela ferme correctement le fichier lorsque vous avez terminé. –

+2

[doc de classe d'E/S] (http://www.ruby-doc.org/core-1.9.3/IO.html#method-c-write) indique qu'il ferme le fichier – nruth

29

Pour ceux d'entre nous qui apprennent par l'exemple ...

écrire du texte dans un fichier comme celui-ci:

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

INFO BONUS ...

relis comme ça

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

Souvent, je veux lire un fichier dans mon presse-papiers ***

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

Et d'autres fois, je veux écrire ce qui est dans mon presse-papiers dans un fichier ***

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

*** Suppose vous avez la pierre précieuse de presse-papier installé

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

+0

Attention, l'option 'IO.write' ** écrase ** le contenu du fichier au lieu de l'ajouter. Ajouter avec IO.write est un peu fastidieux. – fguillen

+0

Vous ne savez pas de quoi vous parlez? La commande IO.write n'a pas besoin de cette option pour écrire dans un fichier. Je serais prudent soit d'enregistrer le fichier dans le répertoire/tmp ou le répertoire en cours; Sinon, vous pourriez voir un message 'Errno :: ENOENT: No tel fichier ou répertoire @ rb_sysopen' et le fichier créé avec une taille de 0 octets. – l3x

14

Pour détruire la précédent contenu du fichier, puis écrire une nouvelle chaîne dans le fichier:

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

pour ajouter un fichier sans écraser son ancien contenu:

open('myfile.txt', "a") { |f| f << 'I am appended string' }