Ruby 파일 I/O 기본 개념
Ruby에서 파일 작업은 주로 File 클래스 또는 File.open 메서드를 통해 이루어집니다. 파일은 블록 형태로 열어 사용 후 자동으로 닫히도록 하는 것이 리소스 누수 방지를 위한 권장 방식입니다.
ruby
File.open("filename.txt", "r") do |file|
# 파일 작업 수행
end
# 블록 종료 시 파일 자동 닫힘
블록을 사용하지 않을 경우 file.close를 명시적으로 호출해야 합니다.
파일 모드
File.open 메서드의 두 번째 인자는 파일 모드를 지정합니다.
-
"r": 읽기 전용 (기본값) -
"w": 쓰기 전용, 파일을 생성하거나 기존 파일 내용을 지움 (truncates). -
"a": 쓰기 전용, 파일 끝에 내용을 추가 (appends). -
"r+": 읽기 및 쓰기, 파일 내용 보존. -
"w+": 읽기 및 쓰기, 파일을 생성하거나 기존 파일 내용을 지움. -
"a+": 읽기 및 쓰기, 파일 끝에 내용을 추가. -
Windows 환경에서는 바이너리 모드(
"rb","wb")에"b"를 추가해야 합니다.
Ruby에서 파일 읽기
파일을 읽는 다양한 방법이 있습니다.
-
파일 전체를 문자열로 읽기:
File.read("example.txt") -
파일 전체를 라인 배열로 읽기:
File.readlines("example.txt") -
라인별 읽기 (메모리 효율적): 대용량 파일에 이상적이며,
File.open블록 내에서file.each_line또는File.foreach를 사용합니다.ruby File.foreach("large_file.txt") do |line| puts line.chomp # 각 라인 처리 end -
특정 바이트 또는 라인 수 읽기:
f.read(16)(16바이트),File.foreach("log.txt").first(5)(첫 5라인). -
인코딩 지정:
File.read("utf8_file.txt", encoding: "UTF-8")또는File.open("file.txt", "r:UTF-8").
Ruby에서 파일 쓰기
파일에 내용을 쓰는 방법 또한 다양합니다.
-
문자열을 파일에 쓰기 (덮어쓰기):
File.write("output.txt", "Hello, Ruby! ")는 가장 간단한 방식입니다. -
File.open블록을 사용한 쓰기:file.puts(개행 포함),file.print(개행 없음),file.write(개행 없음),file <<(shovel operator) 등의 메서드를 활용합니다.ruby File.open("greeting.txt", "w") do |file| file.puts "Hello World" end -
파일에 내용 추가:
File.open("log.txt", "a")또는File.write("log.txt", "New log entry ", mode: "a"). -
라인 배열 쓰기: 배열의 각 요소를 파일에 한 줄씩 쓸 수 있습니다.
실용적인 예제 및 모범 사례
-
파일 복사:
File.write(destination, File.read(source)) -
CSV 읽기/쓰기:
File.open및File.foreach활용 -
안전한 파일 쓰기 (Atomic Write):
require 'tempfile'을 사용하여 임시 파일에 먼저 쓰고,File.rename으로 원본 파일을 교체하여 데이터 손상을 방지합니다. -
경로 처리:
File.expand_path,File.join,Pathname을 사용하여 견고한 경로를 구성합니다. -
오류 처리:
begin...rescue블록(Errno::ENOENT,Errno::EACCES등) 또는File.exist?를 사용하여 잠재적 오류에 대비해야 합니다.
권장 모범 사례:
-
가능하면 항상 블록 형태를 사용하여 파일이 자동으로 닫히도록 합니다.
-
간단한 전체 파일 작업에는
File.read/File.write를 사용합니다. -
대용량 파일은
File.foreach를 사용하여 메모리 효율성을 높입니다. -
비 ASCII 텍스트 작업 시에는 인코딩을 명시합니다.
-
프로덕션 코드에서는 예외를 적절히 처리합니다.