Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

Ruby에서 파일 읽고 쓰는 방법 완벽 정리(실전 예제 코드 포함)

오늘은 Ruby에서 파일을 읽고 쓰는 방법을 배워보겠습니다. 파일 내용을 추출하고, 새로운 파일을 생성하고, 원하는 정보를 찾는 방법까지 실전 예제와 함께 알아봅니다!

목차

  • 1. Ruby에서 파일 읽는 방법
  • 2. Ruby에서 파일에 쓰는 방법
  • 3. Ruby 파일 메서드
  • 4. 디렉터리 작업
  • 5. FileUtils 모듈 사용법
  • 6. 마무리

그럼 바로 시작해볼까요?

Ruby에서 파일 읽는 방법

Ruby에서 파일을 읽는 기본 흐름은 다음과 같습니다.

  1. open 메서드로 파일을 엽니다.
  2. 파일을 읽습니다. 전체를 한 번에 읽거나, 한 줄씩, 또는 특정 바이트만큼 읽을 수 있습니다.
  3. close 메서드로 파일을 닫습니다.

각 단계를 자세히 살펴보겠습니다.

File 클래스를 사용해 파일을 여는 방법은 다음과 같습니다.

file = File.open("users.txt")

이렇게 하면 File 객체를 얻게 됩니다. 아직 파일의 실제 내용을 가져온 것은 아니라는 점에 유의하세요.

이제 파일 내용을 읽는 세 가지 방법을 소개합니다.

1. 파일 전체 읽기

가장 간단한 방법은 파일 전체를 한 번에 읽는 것입니다.

file_data = file.read

# "user1\nuser2\nuser3\n"

여러 줄로 된 파일을 다룬다면 file_datasplit으로 분리하거나, 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로 파일에 데이터를 쓰려면 다음 순서를 따릅니다.

  1. 쓰기 모드("w" 플래그)로 파일을 엽니다.
  2. write 메서드로 데이터를 추가합니다.
  3. 블록 형태를 사용하지 않았다면 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.readFile.write 같은 내장 메서드를 활용해 Ruby에서 파일과 폴더를 관리하는 방법을 배웠습니다. 이 내용을 실습해 보면서 여러분의 프로젝트에 바로 적용해 보세요!

읽어주셔서 감사합니다!