666 Stimmen

Wie schreibe ich in Ruby in eine Datei?

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

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

991voto

Todd R Punkte 17676

Sind Sie auf der Suche nach Folgendem?

File.open(yourfile, 'w') { |file| file.write("Ihr Text") }

3 Stimmen

Es gibt wahrscheinlich die Anzahl der betroffenen Zeichen zurück. Ich brauche das Dateiobjekt als Rückgabewert. Irgendwelche Ideen?

10 Stimmen

yourfile ist eine Variable, die den Namen der zu schreibenden Datei enthält.

20 Stimmen

Alternativ: f = Datei öffnen('name','w'); f. schreiben('text'); f. schließen

765voto

Sie können die Kurzversion verwenden:

File.write('/Pfad/zur/Datei', 'Einige glorreiche Inhalte')

Es gibt die zurückgegebene Länge an; siehe ::write für weitere Details und Optionen.

Um an die Datei anzuhängen, wenn sie bereits existiert, verwenden Sie:

File.write('/Pfad/zur/Datei', 'Einige glorreiche Inhalte', mode: 'a')

14 Stimmen

FYI diese Kurzschreibweise funktioniert nur ab Ruby 1.9.3. Es gibt keine solche Methode in früheren Versionen von 1.9 oder 1.8. In diesem Fall müssen Sie die längere Blockmethode verwenden, die von @mvndaai veröffentlicht wurde.

20 Stimmen

Zur Information, diese Datei wird ordnungsgemäß geschlossen, wenn sie fertig ist.

2 Stimmen

IO Klassendokumentation besagen, dass es die Datei schließt

270voto

Tombart Punkte 27954

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

 File.open(deineDatei, 'w') { |file| file.write("dein Text") }

Wenn ein Block an File.open übergeben wird, wird das File-Objekt automatisch geschlossen, wenn der Block beendet ist.

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

begin
  file = File.open("/tmp/some_file", "w")
  file.write("dein Text") 
rescue IOError => e
  #Ein Fehler ist aufgetreten, Verzeichnis nicht beschreibbar usw.
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;
}

0 Stimmen

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

0 Stimmen

Cool, danke. Ich war mir nicht sicher darüber. Hier ist mehr Information über Blöcke und File.open blog.rubybestpractices.com/posts/rklemme/… es wird auch in der offiziellen Dokumentation erwähnt.

1 Stimmen

Etwas auf die Ruby-Art: nil ist ein Objekt, also um zu überprüfen, ob eine Datei Null ist, fragen Sie das Objekt selbst anstatt zu vergleichen (file.nil? anstelle von file == nil)

195voto

jdl Punkte 17444

Die Ruby File-Klasse gibt Ihnen Einblicke in ::new und ::open, aber ihre Elternklasse, die IO-Klasse, geht tiefer in die Details von #read und #write.

6 Stimmen

Danke @Geoff. Es ist gut zu sehen, wie neue Benutzer veraltete Fragen und Antworten aufräumen. Macht die Seite insgesamt besser.

7 Stimmen

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, mag es erschienen sein, dass der Fragesteller wenig Mühe investiert hat, aber aus Googles Sicht ist dies jetzt die beste Quelle.

7 Stimmen

Wahrscheinlich, weil hier alles steht, was man wirklich wissen muss. Meine Antwort entspricht dem Sprichwort "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben ", für diejenigen, die die Feinheiten lesen möchten, und es gibt auch viele "Gib einem Mann einen Fisch" Antworten hier für Leute, die einfach nur kopieren und einfügen möchten. Es ist nicht überraschend, dass diese Kombination auf Google gut gerankt ist.

118voto

mvndaai Punkte 2937

Zambri's Antwort hier gefunden ist die beste.

File.open("out.txt", '') {|f| f.write("Schreibe hier deinen Text") }

wo deine Optionen für sind:

r - Nur Lesen. Die Datei muss vorhanden sein.

w - Erstelle eine leere Datei zum Schreiben.

a - An eine Datei anhängen. Die Datei wird erstellt, falls sie nicht existiert.

r+ - Öffne eine Datei zum Aktualisieren, sowohl zum Lesen als auch zum Schreiben. Die Datei muss vorhanden sein.

w+ - Erstelle eine leere Datei zum Lesen und Schreiben.

a+ - Öffne eine Datei zum Lesen und Anhängen. Die Datei wird erstellt, falls sie nicht existiert.

In deinem Fall ist w vorzuziehen.

0 Stimmen

@CarySwoveland Ich stimme tatsächlich mit Ihnen überein. Das eigentliche Problem ist, dass eine der beiden Fragen schon vor langer Zeit als Duplikat hätte markiert werden sollen. Ich habe die Antwort kopiert, weil ich einmal die Frage gefunden hatte, die zanbri beantwortet hatte, und die nächsten Male, als ich dieselben Informationen benötigte, zuerst auf diese Frage gestoßen bin und herausfinden musste, wie ich zur anderen Frage gelangen konnte. Schließlich dachte ich, es wäre einfacher, auch seine Antwort hier zu haben. Ich habe zu seiner Antwort verlinkt, damit hoffentlich Menschen darauf klicken und ihm auch einen Upvote geben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X