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

파이썬 os.open()과 os.fdopen()의 차이점 완벽 정리

파일 디스크립터란 무엇인가?

파일 디스크립터(file descriptor)는 운영체제 커널이 직접 제공하는 저수준(low-level) 파일 입출력 기능입니다. 파일 디스크립터는 각 프로세스마다 커널이 관리하는 열린 파일 테이블에서 해당 파일을 식별하는 정수 값입니다.

다양한 시스템 콜(system call)이 파일 디스크립터를 인자로 받지만, 직접 다루기에는 불편한 점이 많습니다. 예를 들어 고정 크기의 버퍼를 사용해야 하거나, 특정 조건에서 여러 번 재시도해야 하며, 오류 처리 역시 개발자가 직접 수행해야 합니다.

파일 객체는 어떤 점이 다른가?

파일 객체(file object)는 파일 디스크립터를 감싸서(wrap) 파일 작업을 더 편리하고 안전하게 만들어 주는 파이썬 클래스입니다. 대표적인 장점은 다음과 같습니다.

  • 오류 처리가 자동으로 이루어집니다
  • 버퍼링(buffering)을 지원하여 입출력 성능이 향상됩니다
  • 한 줄씩 읽기 같은 편리한 읽기/쓰기 메서드를 제공합니다
  • 가비지 컬렉션(garbage collection) 시점에 자동으로 파일이 닫힙니다

open(), os.open(), os.fdopen() 비교

  • 내장 open(): 파일 이름(경로)을 받아 새로운 파이썬 파일 객체를 반환합니다. os.open()과는 완전히 다른 함수라는 점에 주의하세요.
  • os.open(): 파일 이름을 받아 새로운 파일 디스크립터를 반환합니다. 이 디스크립터는 os.read(), os.write()와 같은 저수준 함수에 전달하거나, os.fdopen()에 넘겨 파일 객체로 변환할 수 있습니다.
  • os.fdopen(): 이미 존재하는 파일 디스크립터를 받아 그 위에 파이썬 파일 객체를 생성합니다. 즉, 파일 디스크립터를 완전한 파일 객체로 변환해 주며, C 코드나 저수준 파일 디스크립터만 반환하는 API와 연동할 때 특히 유용합니다.

예제 코드로 살펴보기

다음 예제는 os.open()으로 얻은 파일 디스크립터를 os.fdopen()으로 파일 객체로 변환하는 과정을 보여줍니다.

import os

# 저수준 방식: 파일 디스크립터 생성
fd = os.open("example.txt", os.O_WRONLY | os.O_CREAT)
os.write(fd, b"Hello, World!")
os.close(fd)

# 파일 디스크립터를 파일 객체로 변환
fd = os.open("example.txt", os.O_RDONLY)
f = os.fdopen(fd, "r")
print(f.read())   # Hello, World!
f.close()

정리

os.open()os.fdopen()은 모두 파이썬에서 운영체제 수준에 가까운 기능을 활용할 수 있게 해주는 도구입니다. 일반적인 파일 작업이라면 내장 open()을 사용하는 것이 가장 간단하지만, 시스템 콜 제어나 외부 C 라이브러리 연동처럼 세밀한 제어가 필요한 상황에서는 파일 디스크립터와 os.fdopen() 조합이 강력한 해결책이 됩니다.