Каковы все распространенные способы чтения файлов в Ruby?
Например, вот один метод:
fileObj = File.new($fileName, "r")
while (line = fileObj.gets)
puts(line)
end
fileObj.close
Я знаю, что Руби чрезвычайно гибок. Каковы преимущества / недостатки каждого подхода?
Ответы:
Также возможно явно закрыть файл после того, как описано выше (передать блок, чтобы закрыть
open
его для вас):источник
foreach
вместоopen
и обойтись безeach_line
блока.f.each { |line| ... }
иf.each_line { |line| ... }
похоже, ведут себя так же (по крайней мере, в Ruby 2.0.0).Самый простой способ, если файл не слишком длинный:
Действительно,
IO.read
илиFile.read
автоматически закрывать файл, поэтому нет необходимости использоватьFile.open
с блоком.источник
IO.read
илиFile.read
также автоматически закрывать файл, хотя ваша формулировка звучит так, как будто это не так.Остерегайтесь «хлебать» файлы. Это когда вы читаете весь файл в память сразу.
Проблема в том, что он плохо масштабируется. Вы можете разрабатывать код с файлом разумного размера, затем запустить его в производство и вдруг обнаружите, что пытаетесь прочитать файлы размером в гигабайты, и ваш хост зависает, когда пытается прочитать и выделить память.
Строковый ввод-вывод очень быстрый и почти всегда эффективен, как прихлебывание. Это удивительно быстро на самом деле.
Мне нравится использовать:
или
Файл наследуется от IO и
foreach
находится в IO, поэтому вы можете использовать любой из них.У меня есть некоторые тесты, показывающие влияние попыток чтения больших файлов с помощью
read
построчного ввода-вывода в разделе « Почему« выкраивать »файл не является хорошей практикой? ».источник
Вы можете прочитать файл сразу:
Когда файл большой или может быть большим, обычно лучше обрабатывать его построчно:
Иногда вы хотите получить доступ к дескриптору файла или контролировать чтение:
В случае двоичных файлов вы можете указать nil-разделитель и размер блока, например:
Наконец, вы можете сделать это без блока, например, при обработке нескольких файлов одновременно. В этом случае файл должен быть явно закрыт (улучшено согласно комментарию @antinome):
Ссылки: Файловый API и IO API .
источник
for_each
в файле или IO. Используйтеforeach
вместо этого.while
вместоloop
и использовать,ensure
чтобы обеспечить закрытие файла, даже если возникает исключение. Вот так (замените точку с запятой на новую строку)begin; f = File.open('testfile'); while line = f.gets; puts line; end; ensure; f.close; end
.Один простой метод заключается в использовании
readlines
:Каждая строка во входном файле будет записана в массиве. Метод обрабатывает открытие и закрытие файла для вас.
источник
read
и любой другой вариант, это приведет к извлечению всего файла в память, что может вызвать серьезные проблемы, если файл больше доступной памяти. Кроме того, поскольку это массив, Ruby должен создать массив, что дополнительно замедляет процесс.http://www.ruby-doc.org/core-1.9.3/IO.html#method-c-read
источник
Я обычно делаю это:
Это даст вам весь текст в виде строкового объекта. Работает только под Ruby 1.9.
источник
вернуть последние n строк из your_file.log или .txt
источник
Еще более эффективный способ - потоковая передача, запрашивая ядро операционной системы открыть файл, а затем считывать байты из него по крупицам. При чтении файла на строку в Ruby данные берутся из файла по 512 байт за раз и после этого разделяются на «строки».
Буферизуя содержимое файла, количество вызовов ввода / вывода уменьшается при делении файла на логические порции.
Пример:
Добавьте этот класс в ваше приложение в качестве объекта службы:
Вызовите его и передайте
:each
метод блок:Читайте об этом здесь в этом подробном сообщении:
Ruby Magic Slurping & Streaming файлы от AppSignal
источник
Я думаю, что этот метод является наиболее "необычным". Может быть, это немного сложно, но работает, если
cat
установлен.источник
content = File.read(filename)