[ruby] Ruby에서 파일을 읽는 일반적인 방법은 무엇입니까?

Ruby에서 파일을 읽는 일반적인 방법은 무엇입니까?

예를 들어, 여기에 한 가지 방법이 있습니다.

fileObj = File.new($fileName, "r")
while (line = fileObj.gets)
  puts(line)
end
fileObj.close

Ruby가 매우 유연하다는 것을 알고 있습니다. 각 접근 방식의 장점 / 단점은 무엇입니까?



답변

File.open("my/file/path", "r") do |f|
  f.each_line do |line|
    puts line
  end
end
# File is closed automatically at end of block

위와 같이 한 후에 파일을 명시 적으로 닫을 수도 있습니다 (블록을 ​​전달하여 open닫습니다).

f = File.open("my/file/path", "r")
f.each_line do |line|
  puts line
end
f.close


답변

파일이 너무 길지 않은 경우 가장 쉬운 방법은 다음과 같습니다.

puts File.read(file_name)

실제로 IO.read또는 File.read자동으로 파일을 닫으므로 File.open블록과 함께 사용할 필요가 없습니다 .


답변

“슬러그”파일에주의하십시오. 그때 전체 파일을 한 번에 메모리로 읽습니다.

문제는 확장 성이 좋지 않다는 것입니다. 합리적인 크기의 파일로 코드를 개발 한 다음 프로덕션 환경에 넣고 갑자기 기가 바이트로 측정되는 파일을 읽으려고 시도하고 호스트가 메모리를 읽고 할당하려고 시도함에 따라 호스트가 멈추고있는 것을 발견 할 수 있습니다.

라인 별 I / O는 매우 빠르며 거의 항상 slurping만큼 효과적입니다. 실제로 놀랍도록 빠릅니다.

나는 사용하고 싶다 :

IO.foreach("testfile") {|x| print "GOT ", x }

또는

File.foreach('testfile') {|x| print "GOT", x }

파일은 IO에서 상속되며 IO에 foreach있으므로 둘 중 하나를 사용할 수 있습니다.

“파일을”끄는 “이 좋은 방법이 아닌 이유”read 에서 줄 단위 I / O를 통해 큰 파일을 읽는 데 따른 영향을 보여주는 벤치 마크 결과가 있습니다.


답변

한 번에 파일을 읽을 수 있습니다.

content = File.readlines 'file.txt'
content.each_with_index{|line, i| puts "#{i+1}: #{line}"}

파일이 크거나 크면 대개 한 줄씩 처리하는 것이 좋습니다.

File.foreach( 'file.txt' ) do |line|
  puts line
end

때로는 파일 핸들에 액세스하거나 읽기를 직접 제어하려는 경우가 있습니다.

File.open( 'file.txt' ) do |f|
  loop do
    break if not line = f.gets
    puts "#{f.lineno}: #{line}"
  end
end

이진 파일의 경우 다음과 같이 nil-separator와 블록 크기를 지정할 수 있습니다.

File.open('file.bin', 'rb') do |f|
  loop do
    break if not buf = f.gets(nil, 80)
    puts buf.unpack('H*')
  end
end

마지막으로 여러 파일을 동시에 처리 할 때와 같이 블록없이 수행 할 수 있습니다. 이 경우 파일을 명시 적으로 닫아야합니다 (@antinome의 설명에 따라 개선).

begin
  f = File.open 'file.txt'
  while line = f.gets
    puts line
  end
ensure
  f.close
end

참고 : 파일 APIIO의 API .


답변

간단한 방법 중 하나를 사용하는 것입니다 readlines.

my_array = IO.readlines('filename.txt')

입력 파일의 각 줄은 배열의 항목이됩니다. 이 메소드는 파일 열기 및 닫기를 처리합니다.


답변

file_content = File.read('filename with extension');
puts file_content;

http://www.ruby-doc.org/core-1.9.3/IO.html#method-c-read


답변

나는 보통 이것을한다 :

open(path_in_string, &:read)

이것은 전체 텍스트를 문자열 객체로 제공합니다. Ruby 1.9에서만 작동합니다.