Как создать файл в Ruby

Я пытаюсь создать новый файл, но, похоже, что-то работает не так, как я ожидал. Вот что я пробовал:

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

Судя по всему, что я читал в Интернете, все они должны работать, но каждый из них дает мне следующее:

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

Это происходит как из IRB, так и из Ruby-скрипта. Что мне не хватает?


person Civatrix    schedule 27.10.2011    source источник
comment
Первые два не должны работать, но вторые два являются синонимами и определенно должны работать.   -  person Andrew Marshall    schedule 27.10.2011
comment
@ Андрей: Вы думаете, что пробовали только первые два?   -  person mu is too short    schedule 27.10.2011
comment
@muistooshort Это единственный вывод, к которому я могу прийти. Ошибка разрешений вызвала бы Errno::EACCES, а не ENOENT.   -  person Andrew Marshall    schedule 27.10.2011
comment
Хорошо, теперь я чувствую себя глупо. Первые два точно не работают, а вот вторые два работают. Не знаю, как я убедил себя, что пробовал их. Извините за зря потраченное время.   -  person Civatrix    schedule 27.10.2011
comment
@Civatrix Это не проблема. Мы все иногда теряем время.   -  person Darth Egregious    schedule 14.10.2016


Ответы (9)


Использовать:

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

где ваши варианты:

  • r - Только чтение. Файл должен существовать.
  • w - Создать пустой файл для записи.
  • a - Добавить в файл. Если файл не существует, создается.
  • r+ - Открыть файл для обновления как для чтения, так и для записи. Файл должен существовать.
  • w+ - Создать пустой файл для чтения и записи.
  • a+ - Открыть файл для чтения и добавления. Если файл не существует, он создается.

В вашем случае предпочтительнее 'w'.

ИЛИ у вас может быть:

out_file = File.new("out.txt", "w")
#...
out_file.puts("write your stuff here")
#...
out_file.close
person zanbri    schedule 27.10.2011
comment
отличный ответ. Ruby conevntion - это змейка для имен переменных. Внимание для новичков. outFile должен выглядеть как out_file. - person Adam Waite; 08.08.2013
comment
@AdamWaite Я отредактировал ответ в соответствии с вашим предложением snake_case, оставив этот комментарий для контекста. - person Kris; 08.08.2013
comment
@zanbri - что будет, если я не закрою файл? - person Erran Morad; 27.09.2014
comment
отличный ответ, исчерпывающий и краткий - person Boris; 26.11.2014
comment
@Kris Будет ли то же самое работать и для создания файлов .docx? Потому что я могу создать файл, но у меня проблема с его открытием. - person Sri Harsha Kappala; 13.02.2015
comment
Следует сделать. Проблема может заключаться в кодировке символов или в двоичном формате docx. - person Kris; 13.02.2015
comment
Как вы думаете, можно ли писать File.new("out.txt", "w").close, если кто-то просто хочет создать новый файл, не помещая в него содержимое во время создания? Будет ли файл правильно закрыт после создания с этим синтаксисом? - person jj_; 07.08.2015
comment
@jj_ Думаю, это сработает. Вы также можете сделать File.open("out.txt", "w") {}, как описано здесь: stackoverflow.com/a/8100754/3345375 - person jkdev; 19.11.2015
comment
@BoratSagdiyev Объект File, на который больше нет ссылок, получает право на сборку мусора. Файл будет автоматически закрыт при сборке мусора для объекта File. rootr.net/rubyfaq-9.html - person jkdev; 19.11.2015
comment
Как я могу сделать многострочный файл, как будто я должен составить список учеников и их возраст. Как столбец и строки. Это может сработать? - person Uttam Manher; 16.08.2018
comment
Отличный ответ с отличным объяснением каждого режима. Я просто добавлю, что сокращенный метод для этого: File.write( "out.txt", "write_your_stuff_here" ). Это обрежет существующий файл или создаст новый файл, если он не существует, запишет в него содержимое и закроет файл. - person Joshua Pinter; 08.12.2018
comment
@jkdev, да, он будет закрыт, но полагаться на него по-прежнему считается запахом кода, как если бы программист никогда не закрывал файлы и позволял ОС закрывать файлы, когда интерпретатор завершает работу. И то и другое может привести к серьезной ошибке, если открыто несколько файлов, и код никогда не закрывает их, что приводит к неуправляемому состоянию и ошибке. Лучше и безопаснее сознательно закрывать их или полагаться на блок, который делает это автоматически. - person the Tin Man; 06.12.2019

Пытаться

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

без использования

File.new "out.txt"
person GMD    schedule 27.10.2011

Попробуйте использовать "w+" в качестве режима записи вместо просто "w":

File.open("out.txt", "w+") { |file| file.write("boo!") }
person Chris Bunch    schedule 27.10.2011
comment
Зависит от того, хотите ли вы только писать (w) или и читать, и писать (w+). - person jkdev; 19.11.2015

Хорошо, теперь я чувствую себя глупо. Первые два точно не работают, а вот вторые два работают. Не знаю, как я убедил себя, что пробовал их. Извините за зря потраченное время.

Если это кому-то поможет, это может произойти, когда вы пытаетесь создать новый файл в несуществующем каталоге.

person tom    schedule 10.07.2012

Если цель состоит в том, чтобы просто создать файл, наиболее простой способ, который я вижу:

 FileUtils.touch "foobar.txt"
person Nicola Mingotti    schedule 26.02.2019

Каталог не существует. Убедитесь, что он существует, поскольку open не будет создавать эти каталоги за вас.

Я сам столкнулся с этим некоторое время назад.

person nterry    schedule 09.12.2014

File.new и File.open по умолчанию используют режим чтения ('r') в качестве механизма безопасности, чтобы избежать возможной перезаписи файла. Мы должны явно указать Ruby использовать режим записи ('w' - наиболее распространенный способ), если мы собираемся выводить данные в файл.

Если выводимый текст является строкой, а не записывать:

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

или хуже:

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

Используйте более сжатый write:

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

write имеет разрешенные режимы, поэтому при необходимости мы можем использовать 'w', 'a', 'r+'.

open с блоком полезен, если вам нужно вычислить вывод в итеративном цикле и вы хотите оставить файл открытым при этом. write полезен, если вы собираетесь вывести контент за один раз, а затем закрыть файл.

Дополнительную информацию см. В документации.

person the Tin Man    schedule 09.05.2017
comment
Отличный ответ, это самый идиоматический и, следовательно, рубиевский путь. Должен быть главный ответ. - person Gino; 05.12.2019
comment
Что ж, согласен. Я редко использую блочную форму для записи файлов. Слишком уж визуально-шумно. - person the Tin Man; 06.12.2019

data = 'data you want inside the file'.

Вы можете использовать File.write('name of file here', data)

person ispirett    schedule 21.02.2020

Вы также можете использовать константы вместо строк, чтобы указать желаемый режим. Преимущество состоит в том, что если вы сделаете опечатку в постоянном имени, ваша программа вызовет исключение во время выполнения.

Константы равны File::RDONLY, File::WRONLY или File::CREAT. Вы также можете комбинировать их, если хотите.

Полное описание режимов открытия файлов на ruby-doc.org

person Alex Tamoykin    schedule 18.11.2015