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?
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?
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
.
Vous cherchez ce qui suit?
File.open(yourfile, 'w') { |file| file.write("your text") }
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;
}
Oui, en utilisant la syntaxe du bloc avec {| file | ....} fermera le fichier lorsque le bloc se ferme. – wesgarrison
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
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
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.
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.
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 –
FYI cela ferme correctement le fichier lorsque vous avez terminé. –
[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
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é
Attention, l'option 'IO.write' ** écrase ** le contenu du fichier au lieu de l'ajouter. Ajouter avec IO.write est un peu fastidieux. – fguillen
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
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' }
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
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
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