So erstellen Sie eine Datei in Ruby

169

Ich versuche eine neue Datei zu erstellen und die Dinge scheinen nicht so zu funktionieren, wie ich es auch erwarte. Folgendes habe ich versucht:

File.new "out.txt"
File.open "out.txt"
File.new "out.txt","w"
File.open "out.txt","w"

Nach allem, was ich online gelesen habe, sollten alle funktionieren, aber jeder einzelne von ihnen gibt mir Folgendes:

ERRNO::ENOENT: No such file or directory - out.txt

Dies geschieht sowohl über IRB als auch über ein Ruby-Skript. Was vermisse ich?

Civatrix
quelle
13
Die ersten beiden sollten nicht funktionieren, aber die zweiten beiden sind synonym und sollten auf jeden Fall funktionieren.
Andrew Marshall
@ Andrew: Du denkst, dass nur die ersten beiden ausprobiert wurden?
Mu ist zu kurz
1
@muistooshort Das ist die einzige Schlussfolgerung, zu der ich gelangen kann. Ein Berechtigungsfehler hätte geworfen Errno::EACCES, nicht ENOENT.
Andrew Marshall
2
OK, jetzt fühle ich mich dumm. Die ersten beiden funktionieren definitiv nicht, die zweiten beiden jedoch. Ich bin mir nicht sicher, wie ich mich davon überzeugt habe, dass ich sie ausprobiert habe. Entschuldigen Sie, dass Sie alle Zeit verschwendet haben.
Civatrix
1
@ Civatrix Das ist kein Problem. Wir alle verschwenden manchmal Zeit.
Darth Egregious

Antworten:

433

Verwenden:

File.open("out.txt", [your-option-string]) {|f| f.write("write your stuff here") }

Wo sind Ihre Optionen:

  • 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 das Lesen und 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 'w'ist vorzuziehen.

ODER Sie könnten haben:

out_file = File.new("out.txt", "w")
#...
out_file.puts("write your stuff here")
#...
out_file.close
zanbri
quelle
11
gute Antwort. Ruby Conevntion ist ein Schlangenfall für Var-Namen. Nur ein Kopf hoch für Neulinge. outFilesollte aussehen wie out_file.
Adam Waite
3
@AdamWaite Ich habe die Antwort gemäß Ihrem Vorschlag für snake_case bearbeitet und diesen Kommentar für den Kontext hinterlassen.
Kris
3
@zanbri - was passiert, wenn ich die Datei nicht schließe?
Erran Morad
1
tolle Antwort, umfassend und kurz
Boris
2
@BoratSagdiyev "Ein Dateiobjekt, auf das nicht mehr verwiesen wird, kann für die Speicherbereinigung verwendet werden. Die Datei wird automatisch geschlossen, wenn das Dateiobjekt durch Speicherbereinigung erfasst wird." rootr.net/rubyfaq-9.html
jkdev
35

Versuchen

File.open("out.txt", "w") do |f|     
  f.write(data_you_want_to_write)   
end

ohne die

File.new "out.txt"
GMD
quelle
25

Versuchen Sie, "w+"als Schreibmodus zu verwenden, anstatt nur "w":

File.open("out.txt", "w+") { |file| file.write("boo!") }
Chris Bunch
quelle
4
Hängt davon ab, ob Sie nur schreiben möchten ( w) oder sowohl lesen als auch schreiben ( w+).
JKDEV
20

OK, jetzt fühle ich mich dumm. Die ersten beiden funktionieren definitiv nicht, die zweiten beiden jedoch. Ich bin mir nicht sicher, wie ich mich davon überzeugt habe, dass ich sie ausprobiert habe. Entschuldigen Sie, dass Sie alle Zeit verschwendet haben.

Falls dies jemand anderem hilft, kann dies auftreten, wenn Sie versuchen, eine neue Datei in einem nicht vorhandenen Verzeichnis zu erstellen.

Tom
quelle
11

Das Verzeichnis existiert nicht. openStellen Sie sicher, dass es existiert, da diese Verzeichnisse nicht für Sie erstellt werden.

Ich bin vor einiger Zeit selbst darauf gestoßen.

nterry
quelle
11

File.newund File.openstandardmäßig read (( 'r') als Sicherheitsmechanismus, um ein mögliches Überschreiben einer Datei zu vermeiden. Wir müssen Ruby ausdrücklich anweisen, den Schreibmodus zu verwenden ( 'w'ist der häufigste Weg), wenn wir in die Datei ausgeben wollen.

Wenn der auszugebende Text eine Zeichenfolge ist, anstatt zu schreiben:

File.open('foo.txt', 'w') { |fo| fo.puts "bar" }

oder schlimmer:

fo = File.open('foo.txt', 'w')
fo.puts "bar"
fo.close

Verwenden Sie die prägnanter write:

File.write('foo.txt', 'bar')

writewir können erlaubten Modi so verwenden 'w', 'a', 'r+'falls erforderlich.

openmit einem Block ist nützlich, wenn Sie die Ausgabe in einer iterativen Schleife berechnen müssen und die Datei dabei offen lassen möchten. writeist nützlich, wenn Sie den Inhalt auf einmal ausgeben und dann die Datei schließen möchten.

Weitere Informationen finden Sie in der Dokumentation .

der Blechmann
quelle
Tolle Resonanz, dies ist der idiomatischste und damit der "rubinistische" Weg. Sollte die beste Antwort sein.
Gino
Da stimme ich zu. Ich benutze das Blockformular selten, um Dateien zu schreiben. Es ist zu visuell laut.
der Blechmann
11

Wenn das Ziel nur darin besteht, eine Datei zu erstellen, sehe ich am direktesten:

 FileUtils.touch "foobar.txt"
Nicola Mingotti
quelle
1
data = 'data you want inside the file'.

Sie können verwenden File.write('name of file here', data)

ispirett
quelle
0

Sie können auch Konstanten anstelle von Zeichenfolgen verwenden, um den gewünschten Modus anzugeben. Der Vorteil ist, dass Ihr Programm eine Laufzeitausnahme auslöst, wenn Sie einen Tippfehler in einem konstanten Namen machen.

Die Konstanten sind File::RDONLYoder File::WRONLYoder File::CREAT. Sie können sie auch kombinieren, wenn Sie möchten.

Vollständige Beschreibung der Modi zum Öffnen von Dateien auf ruby-doc.org

Alex Tamoykin
quelle