오늘은 Ruby에서 파일을 읽고 쓰는 방법을 배워보겠습니다. 파일 내용을 추출하고, 새로운 파일을 생성하고, 원하는 정보를 찾는 방법까지 실전 예제와 함께 알아봅니다!
목차
- 1. Ruby에서 파일 읽는 방법
- 2. Ruby에서 파일에 쓰는 방법
- 3. Ruby 파일 메서드
- 4. 디렉터리 작업
- 5. FileUtils 모듈 사용법
- 6. 마무리
그럼 바로 시작해볼까요?
Ruby에서 파일 읽는 방법
Ruby에서 파일을 읽는 기본 흐름은 다음과 같습니다.
- open 메서드로 파일을 엽니다.
- 파일을 읽습니다. 전체를 한 번에 읽거나, 한 줄씩, 또는 특정 바이트만큼 읽을 수 있습니다.
- close 메서드로 파일을 닫습니다.
각 단계를 자세히 살펴보겠습니다.
File 클래스를 사용해 파일을 여는 방법은 다음과 같습니다.
file = File.open("users.txt")이렇게 하면 File 객체를 얻게 됩니다. 아직 파일의 실제 내용을 가져온 것은 아니라는 점에 유의하세요.
이제 파일 내용을 읽는 세 가지 방법을 소개합니다.
1. 파일 전체 읽기
가장 간단한 방법은 파일 전체를 한 번에 읽는 것입니다.
file_data = file.read # "user1\nuser2\nuser3\n"
여러 줄로 된 파일을 다룬다면 file_data를 split으로 분리하거나, readlines 메서드와 chomp 메서드를 함께 사용해 개행 문자를 제거할 수 있습니다.
예제:
file_data = file.readlines.map(&:chomp) # ["user1", "user2", "user3"]
2. 파일 닫기
파일 작업이 끝나면 메모리와 시스템 리소스를 해제하기 위해 반드시 close로 파일을 닫아야 합니다.
file.close
3. open/close 없이 간편하게 읽기
파일을 직접 열고 닫는 과정이 번거롭다면 File.read 메서드를 사용하세요.
file_data = File.read("user.txt").split
# ["user1", "user2", "user3"]4. 한 줄씩 처리하기
파일 읽기와 관련된 꿀팁 하나 더! 파일을 한 줄씩 처리하고 싶다면 foreach 메서드를 사용하세요.
예제:
File.foreach("users.txt") { |line| puts line }파일 전체를 메모리에 올리지 않고 한 줄씩 처리할 수 있기 때문에, 대용량 파일을 다룰 때 특히 유용합니다.
Ruby에서 파일에 쓰는 방법
Ruby로 파일에 데이터를 쓰려면 다음 순서를 따릅니다.
- 쓰기 모드("w" 플래그)로 파일을 엽니다.
write메서드로 데이터를 추가합니다.- 블록 형태를 사용하지 않았다면
close를 잊지 마세요.
예제:
File.open("log.txt", "w") { |f| f.write "#{Time.now} - User logged in\n" }주의: "w" 플래그는 기존 파일 내용을 모두 덮어씁니다!
기존 내용 뒤에 새 내용을 추가하려면 "w"(쓰기) 플래그 대신 "a"(append) 플래그를 사용하세요.
더 간편한 방법으로 File.write를 사용할 수도 있습니다.
File.write("log.txt", "data...")append 모드로 사용하려면 옵션을 추가하면 됩니다.
File.write("log.txt", "data...", mode: "a")단 한 줄의 코드로 파일에 쓸 수 있는 가장 쉬운 방법입니다 🙂
한 가지 더 알아두세요. 배열을 파일에 쓰려면 먼저 문자열로 변환해야 합니다.
방법은 다음과 같습니다:
File.write("log.txt", [1,2,3].join("\n"), mode: "a")이처럼 객체를 문자열로 변환하는 과정을 직렬화(serialization)라고 부릅니다.
Ruby 파일 메서드
파일은 읽고 쓰는 것 외에도 다양한 작업을 할 수 있습니다.
예를 들어 특정 파일이 존재하는지 확인하거나, 현재 디렉터리의 파일 목록을 가져올 수 있습니다.
자주 사용되는 메서드는 다음과 같습니다:
- rename
- size
- exists?
- extname
- basename
- dirname
- directory?
- file?
몇 가지 예제를 살펴보겠습니다:
# 파일 이름 변경
File.rename("old-name.txt", "new-name.txt")
# 파일 크기(바이트 단위)
File.size("users.txt")
# 파일이 이미 존재하는지 확인
File.exists?("log.txt")
# 파일 확장자 가져오기 (파일이 없어도 동작)
File.extname("users.txt")
# => ".txt"
# 디렉터리 경로를 제외한 파일명 가져오기
File.basename("/tmp/ebook.pdf")
# => "ebook.pdf"
# 파일명을 제외한 경로 가져오기
File.dirname("/tmp/ebook.pdf")
# => "/tmp"
# 파일인지 디렉터리인지 확인
File.directory?("cats")마지막 예제는 디렉터리 목록을 순회하면서 파일만 걸러낼 때 특히 유용합니다.
def find_files_in_current_directory
entries = Dir.entries(".")
entries.reject { |entry| File.directory?(entry) }
end또한 파일 크기, 권한, 생성 날짜 같은 상세 통계 정보도 조회할 수 있습니다.
File.stat("/tmp")디렉터리 작업
Dir.glob을 사용하면 특정 패턴과 일치하는 모든 파일 목록을 손쉽게 가져올 수 있습니다.
몇 가지 예제를 보겠습니다.
# 현재 디렉터리의 모든 파일
Dir.glob("*")
# 이름에 "spec"이 포함된 모든 파일
Dir.glob("*spec*")
# 모든 Ruby 파일
Dir.glob("*.rb")다음 한 줄의 코드는 현재 디렉터리부터 시작해 모든 파일을 재귀적으로 나열합니다.
Dir.glob("**/**")디렉터리만 검색하고 싶다면 아래 코드를 사용하세요.
Dir.glob("**/**/")Dir 클래스로 현재 작업 디렉터리를 확인할 수도 있습니다.
Dir.pwd
디렉터리가 비어 있는지 확인:
Dir.empty?("/tmp")
# false디렉터리가 존재하는지 확인:
Dir.exists?("/home/jesus")
# true새 디렉터리 생성:
Dir.mkdir("/tmp/testing")mktmpdir로 임시 디렉터리 생성:
Dir.mktmpdir do |dir| File.write(dir + "/log.txt", "test") end
FileUtils 모듈 사용법
FileUtils 모듈에는 추가적인 파일 처리 유틸리티가 포함되어 있습니다.
예를 들어 파일 비교, touch로 최근 접근 및 수정 시간 갱신, 그리고 cp_r을 이용한 파일·디렉터리 복사 등이 가능합니다.
사용 예시:
require 'fileutils'
FileUtils.compare_file("a.txt", "b.txt")
FileUtils.touch("/tmp/lock")
FileUtils.cp_r("data", "backup")참고로 cp_r의 "r"은 "recursive(재귀적)"를 의미합니다.
마무리
지금까지 File.read와 File.write 같은 내장 메서드를 활용해 Ruby에서 파일과 폴더를 관리하는 방법을 배웠습니다. 이 내용을 실습해 보면서 여러분의 프로젝트에 바로 적용해 보세요!
읽어주셔서 감사합니다!