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?


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

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"

25

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

File.open("out.txt", "w+") { |file| file.write("boo!") }

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.


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.


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 .


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"

1
data = 'data you want inside the file'.

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


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.