642 votes

Comment écrire dans un fichier en Ruby ?

Je dois lire les données de la base de données et les enregistrer dans un fichier texte.

Comment puis-je faire cela en Ruby ? Existe-t-il un système de gestion de fichiers en Ruby ?

975voto

Todd R Points 4933

Vous recherchez les éléments suivants ?

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

3 votes

Il s'agit probablement d'un retour au nombre de caractères affectés. J'ai besoin d'un fichier objet en retour. Une idée ?

10 votes

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

19 votes

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

729voto

Vous pouvez utiliser la version courte :

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

Il renvoie la longueur écrite ; voir ::écrire pour plus de détails et d'options.

Pour ajouter au fichier, s'il existe déjà, utilisez :

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

14 votes

Pour information, cette méthode abrégée ne fonctionne qu'à partir de Ruby 1.9.3. Il n'existe aucune méthode de ce type dans les versions antérieures de 1.9 ou 1.8. Dans ce cas, vous devez utiliser la méthode de bloc plus longue proposée par @mvndaai.

18 votes

Pour information, cette opération ferme correctement le fichier lorsqu'elle est terminée.

2 votes

Documentation sur la classe IO dit qu'il ferme le fichier

266voto

Tombart Points 4503

C'est l'approche privilégiée dans la plupart des cas :

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

Lorsqu'un bloc est transmis à File.open l'objet File sera automatiquement fermé à la fin du bloc.

Si vous ne passez pas de bloc à File.open vous devez vous assurer que le fichier est correctement fermé et que le contenu a été écrit dans le 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 la 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 votes

Oui, l'utilisation de la syntaxe block avec { |file| .... fermera le fichier à la fermeture du bloc.

0 votes

Cool, merci. Je n'en étais pas sûr. Voici plus d'informations sur les blocs et les File.open blog.rubybestpractices.com/posts/rklemme/ c'est également mentionné dans la documentation officielle

1 votes

Juste un truc à la ruby : nil est un objet, donc pour vérifier si un fichier est nul, on demande à l'objet lui-même au lieu de comparer (file.nil ? au lieu de file == nil).

190voto

jdl Points 12272

Le Rubis Classe de fichiers vous donnera les tenants et les aboutissants de ::new y ::open mais son parent, le Classe IO Il s'agit là d'une question de fond, qui ne peut être résolue qu'avec l'aide de l'Union européenne. #read y #write .

6 votes

Merci @Geoff. Il est bon de voir de nouveaux utilisateurs nettoyer des questions et des réponses périmées. Cela permet d'améliorer le site dans son ensemble.

7 votes

Je trouve cela ironique. La réponse est très bien documentée... mais un an plus tard, cette question est la première à être trouvée sur Google. Lorsque la question a été posée, il a pu sembler que le PO ne consacrait que peu d'efforts, mais aujourd'hui, en ce qui concerne Google, il s'agit de la meilleure source.

7 votes

Probablement parce que tout ce que vous avez besoin de savoir se trouve ici. La mienne est la réponse "apprendre à 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 juste faire du copier-coller. Il n'est pas surprenant que cette combinaison soit bien classée sur Google.

118voto

mvndaai Points 454

Zambri Réponse de la Commission trouvé ici est le meilleur.

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

où se situent vos options en matière de <OPTION> sont :

r - Lire seulement. Le fichier doit exister.

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

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

r+ - Ouvrir un fichier pour le mettre à jour en lecture et en écriture. Le fichier doit exister.

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

a+ - Ouvrir un fichier pour le lire et l'annexer. Le fichier est créé s'il n'existe pas.

Dans votre cas, w est préférable.

0 votes

@CarySwoveland Je suis en fait d'accord avec vous. Le vrai problème est que l'une des deux questions aurait dû être marquée comme un doublon depuis longtemps. J'ai copié la réponse parce qu'une fois que j'ai trouvé la question à laquelle zanbri avait répondu, les fois suivantes où j'ai eu besoin de la même information, je suis tombé sur cette question en premier et j'ai dû trouver comment arriver à l'autre question. Finalement, j'ai pensé qu'il serait plus facile d'avoir sa réponse ici aussi. J'ai mis un lien vers sa réponse pour que les gens puissent cliquer dessus et lui donner un "upvote".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X