Wie schreibe ich in eine Datei in Ruby?


572

Ich muss die Daten aus der Datenbank lesen und sie dann in einer Textdatei speichern.

Wie kann ich das in Ruby machen? Gibt es ein Dateiverwaltungssystem in Ruby?

Antworten:


179

Die Ruby File-Klasse gibt Ihnen die Vor- und Nachteile von ::newund ::opendoch übergibt die übergeordnete Klasse , die IO-Klasse , die Tiefe von #readund #write.


6
Danke @Geoff. Es ist gut zu sehen, wie neue Benutzer veraltete Fragen und Antworten bereinigen. Für eine insgesamt bessere Website.
JDL

7
Ich finde das ironisch. Die Antwort ist sehr gut dokumentiert ... aber jetzt, ein Jahr später, ist diese Frage der erste Treffer bei Google. Als die Frage gestellt wurde, schien es, dass das OP wenig Aufwand betrieben hat, aber für Google ist dies die beste Quelle.
Jeff

7
Wahrscheinlich, weil alles, was Sie wirklich wissen müssen, hier ist. Meine ist die Antwort "Bringe einem Mann das Fischen bei" für diejenigen, die die feineren Details lesen möchten, und es gibt auch hier viele Antworten "Gib einem Mann einen Fisch" für Leute, die nur ausschneiden und einfügen wollen. Es ist nicht verwunderlich, dass diese Kombination bei Google gut platziert ist.
JDL

1
Fairerweise arbeite ich in vielen verschiedenen Sprachen, was bedeutet, dass ich mich selten an die Syntax einer bestimmten Sprache erinnere. Ich habe dies ein paar Mal gegoogelt und scrolle immer direkt über diese Antwort hinaus zu der darunter liegenden, denn wenn ich StackOverflow google, suche ich normalerweise nur nach einem verdammten Fisch. : p Ehrlich gesagt ist es gut, beides zu haben. Vielleicht mache ich eines Tages genug Ruby auf einmal, um mich um die Details zu kümmern.
user435779

2
Dies beantwortet die Frage nicht. Es verweist lediglich auf die beiden Klassen, die die meisten Methoden zum Ausführen von E / A enthalten, und erwähnt die Verbindung mit der Datenbank nicht. Das wäre als Kommentar in Ordnung, qualifiziert sich aber kaum als Antwort. Mir ist klar, dass das OP und die vielen Leser, die diese Antwort positiv bewertet haben, nicht übereinstimmen, und ich verstehe ehrlich gesagt nicht, was sie dachten.
Cary Swoveland

929

Suchen Sie Folgendes?

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

8
yourfileist eine Variable, die den Namen der zu schreibenden Datei enthält.
B Sieben

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

5
@vish: Ich würde diese Lösung nicht empfehlen, da der Dateideskriptor offen bleibt, wenn f.writeeine Ausnahme ausgelöst wird .
Nbarraille

288
Kurz und File.write('filename', 'content')
Benjamin Oakes

14
Noch kürzer und dokumentiert:IO.write('filename', 'content')
Thai

636

Sie können die Kurzversion verwenden:

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

Es gibt die geschriebene Länge zurück; Weitere Details und Optionen finden Sie unter :: write .

Verwenden Sie zum Anhängen an die Datei, falls diese bereits vorhanden ist:

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

14
Zu Ihrer Information, diese Kurzmethode funktioniert nur ab Ruby 1.9.3. In früheren Versionen von 1.9 oder 1.8 gibt es keine solche Methode. In diesem Fall müssen Sie die längere Blockmethode verwenden, die von @mvndaai
Andrew Burns am

13
Zu Ihrer Information, dies schließt die Datei ordnungsgemäß, wenn Sie fertig sind.
Freedom_Ben

2
IO-Klassendokumente sagen, dass es die Datei
schließt

7
Wird dies an eine Datei angehängt oder nur überschrieben?
Joshua Pinter

8
@ JoshPinter: es überschreibt.
mklement0

248

Dies ist in den meisten Fällen der bevorzugte Ansatz:

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

Wenn ein Block an übergeben wird, File.openwird das Dateiobjekt automatisch geschlossen, wenn der Block beendet wird.

Wenn Sie keinen Block an übergeben File.open, müssen Sie sicherstellen, dass die Datei korrekt geschlossen ist und der Inhalt in die Datei geschrieben wurde.

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

Sie finden es in der Dokumentation :

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

Ja, mit der Blocksyntax mit {| file | ....} schließt die Datei, wenn der Block geschlossen wird.
Wesgarrison

Cool, danke. Da war ich mir nicht sicher. Hier sind einige weitere Informationen über Blöcke und File.open blog.rubybestpractices.com/posts/rklemme/… es wird auch in der offiziellen Dokumentation erwähnt
Tombart

1
Nur etwas Rubinhaftes: nil ist ein Objekt. Um zu überprüfen, ob eine Datei null ist, fragen Sie das Objekt selbst, anstatt es zu vergleichen (file.nil? Anstelle von file == nil)
JCabello

@ JCabello sicher, das ist definitiv mehr Ruby-ähnlicher Ansatz, danke!
Tombart

Endlich eine Antwort, die zeigt, dass man auch den Dateistatus und den Umgang damit überprüfen sollte und nicht nur einen Liner, der nur den offenen Anruf anzeigt.
Nasser

115

Die Antwort von Zambri , die hier gefunden wird, ist die beste.

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

Wo sind Ihre Optionen für <OPTION>:

r- Schreibgeschützt. Die Datei muss vorhanden sein.

w - Erstellen Sie eine leere Datei zum Schreiben.

a - An eine Datei anhängen. Die Datei wird erstellt, wenn sie nicht vorhanden ist.

r+- Öffnen Sie eine Datei, um sowohl das Lesen als auch das Schreiben zu aktualisieren. Die Datei muss vorhanden sein.

w+ - Erstellen Sie eine leere Datei zum Lesen und Schreiben.

a+- Öffnen Sie eine Datei zum Lesen und Anhängen. Die Datei wird erstellt, wenn sie nicht vorhanden ist.

In Ihrem Fall wist vorzuziehen.


Ich bin erschüttert, dass eine Antwort, die zugegebenermaßen eine andere Antwort kopiert, über 100 positive Stimmen erhalten könnte. Ich kann den ersten Satz als Kommentar zur Frage sehen, aber das war's.
Cary Swoveland

@CarySwoveland Ich stimme dir tatsächlich zu. Das eigentliche Problem ist, dass eine der beiden Fragen vor langer Zeit als Duplikat hätte markiert werden müssen. Ich habe die Antwort kopiert, weil ich, sobald ich die Frage gefunden hatte, die zanbri beantwortet hatte, und die nächsten Male, als ich die gleichen Informationen benötigte, zuerst auf diese Frage stieß und herausfinden musste, wie ich zu der anderen Frage komme. Schließlich dachte ich, es wäre einfach einfacher, auch hier seine Antwort zu haben. Ich habe so hoffentlich auf seine Antwort verlinkt, dass die Leute darauf klicken und ihm ebenfalls eine positive Bewertung geben würden.
mvndaai

31

Für diejenigen von uns, die mit gutem Beispiel lernen ...

Schreiben Sie Text in eine Datei wie diese:

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

BONUS INFO ...

Lies es so zurück

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

Häufig möchte ich eine Datei in meine Zwischenablage einlesen ***

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

Und manchmal möchte ich schreiben, was sich in meiner Zwischenablage befindet, in eine Datei ***

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

*** Angenommen, Sie haben das Zwischenablage-Juwel installiert

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


1
Beachten Sie, dass die IO.writeOption den Dateiinhalt überschreibt, anstatt ihn anzuhängen. Mit IO.write anhängen ist etwas langweilig.
Fguillen

Nicht sicher, wovon du sprichst? Der Befehl IO.write benötigt diese Option nicht, um in eine Datei zu schreiben. Ich würde darauf achten, die Datei entweder im Verzeichnis / tmp oder im aktuellen Verzeichnis zu speichern. Andernfalls wird möglicherweise eine Errno::ENOENT: No such file or directory @ rb_sysopenNachricht angezeigt und die Datei mit einer Größe von 0 Byte erstellt.
13.x

25

Um den vorherigen Inhalt der Datei zu zerstören, schreiben Sie eine neue Zeichenfolge in die Datei:

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

So hängen Sie eine Datei an, ohne den alten Inhalt zu überschreiben:

open('myfile.txt', "a") { |f| f << 'I am appended string' } 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.