본문 바로가기
Python

[Python] file : open and close

by ds31x 2023. 7. 4.

Python 에서 file을 처리하기 위해선 다른 프로그래밍 언어와 마찬가지로 file에 대한 접근이 가능한 object를 얻어와야함.

 

  • 이같은 object는 file handler, file descriptor 등의 여러 이름으로 불리며, 이를 얻어오는 작업을 가르켜 open이라고 지칭하는게 일반적임.
  • 때문에 file을 처리하기 위해 가장 먼저 수행되는 작업을 file을 연다(open) 라고 표현함.

 

파일을 연다는 것

  • file을 memory로 읽어들이고,
  • 읽어들여진 file의 content등에 접근할 수 있는 기능이 구현된 object를 얻는 것이라고 할 수 있음.
  • 이후 해당 object가 제공하는 여러 file관련 operator를 통해 읽기, 쓰기 등등이 이루어짐.

 

파일을 열어서 해당 file (=OS관점에선 일종의 resource)에 대한 처리가 끝나고 나면

반드시 open을 통해 얻은 object를 이용하여 파일을 닫아주어야 함(close).

파일을 닫는다는 것

  • 해당 file에 관련하여 OS가 제공해준 resource를 반환하는 것을 의미한다.
  • C 에서는 close를 명시적으로 반드시 해줘야하는 반면,
  • Python 에서는 context manager with를 통해 이를 쉽게 처리할 수 있다는 장점을 가짐.

Python에서 open을 통해 얻은 file object를 명시적으로 닫지 않더라도
더이상 참조되지 않는 경우엔 자동으로 close가 이뤄짐.
예를 들어
함수 내부에서 open된 경우 해당 함수가 반환된 이후에는 자동으로 close가 된다.
하지만 가급적 명시적으로 close를 하는 것이 좋고,
권장되는 것은 context manager를 이용하여 파일을 처리하는 것이다.


File 열기 : open

fin = open('file_path', 'wt')
  • file_path : open하려고 하는 파일의 path. absoulte path 또는 relative path를 문자열 argument로 지정해줌.
  • wt : mode라고 불리며, file을 어떤 작업이 가능하도록 열지를 지정하는 문자열임.

path (경로)

Python은 다른 프로그래밍 언어와 마찬가지로 기본적으로 current working directory (cwd, 또는 present working directory라고도 불림)를 기준으로 하는 relative path로 파일 경로를 지정가능함.

  • cwd : python interpreter로 프로그램을 수행하는 경우, 해당 수행을 시키기 위해 command가 입력될 당시의 directory를 가르킴.

하지만 가급적 absolute path를 사용하는 것이 에러를 줄이는 방법 중 하나임.

 

 

Path 및 Python에서 cwd등의 처리방법에 대한 자세한 내용은 다음 URL을 참고할 것.

https://dsaint31.me/mkdocs_site/OS/path

 

BME228

Path (경로) 파일 시스템 내에서 특정 파일(혹은 디렉토리)의 위치를 나타내는 양식 Absolute Path (절대 경로) 현 작업디렉토리(cwd)와 관계없이 절대적 위치 드라이브:\폴더\폴더\파일명 (windows) c:\Windo

dsaint31.me


mode argument

mode는 하나 또는 두개의 character로 이루어짐.

첫번째 character는 열고자 하는 file에 대해 어떤 작업을 가능하게할지를 지정함.

  • r : read 즉 읽기모드로 파일을 연다.
  • w : write 즉 쓰기모드로 파일을 연다. (기본 파일이 있을 경우, 기존 파일이 삭제되고 새로 쓰여짐.)
  • a : append 즉 뒤에 추가하는 모드로 파일을 연다.
  • x : write 모드이나 반드시 새로 만드는 파일이어야 한다. (기존 파일이 존재시 Exception발생.)

두번째 character는 열고자 하는 file의 종류를 지정한다.

  • t : 기본값으로 file을 text파일 이라고 생각하고 open. 때문에 t는 생략가능함.
  • b : file을 binary 파일이라고 생각하고 open. 기본적으로 text file로 열게 되어있기 때문에 반드시 binary file을 열 때는 b를 추가해줘야함.

file 닫기

fin = open('file_path', 'wt')

# fin에 내용을 쓰는 처리 등등.

fin.close() # file 닫기

Context manager : with statement

context manager는 원하는 특정 구간에서 resource를 얻고 반환하는 것을 관리해준다.

 

가장 많이 사용되는 context manager는 with statement로서

  • with statment로 시작하는 code block으로 들어갈 경우
    • 정해진 resource를 얻는 처리가 자동으로 수행되며,
  • 해당 block을 나갈 때
    • 자동으로 해당 resource를 반환하는 처리가 수행된다.

 

구문은 다음과 같음.

# 다음 with 문의 expression_for_resource 는 expression으로 evaluation이 이루어짐.
# 해당 evaluaiton으로 얻어진 리소스 관련 object가 가지고 있는 __enter__ 메서드가 호출됨.
# - __enter__ 메서드에서 해당 object를 사용하기 위한 초기 작업이 구현되어 있음.
# as 를 통해 해당 object를 참조하는 variable name 이 설정됨.
# 이후 context manager 가 관리하는 block이 수행.
# 해당 block을 나갈 때, with로 얻어진 object의 __exit__ 메서드가 호출됨.
# - __exit__ 메서드에서 해당 object와 관련된 resource를 반환하는 작업(file의 경우 close)들이 구현됨.
with expression_for_resource as alias_name: 
    # alias_name이 참조하는 resource 객체를 다루는 작업이 이루어짐.
    # 이 block내에서 나가면 resource 관련 객체를 반환이 이루어짐.

 

간단하게 파일을 with statement로 처리하면 다음과 같음.

with open('file_path', 'wt') as fin:
    fin.write('test!')
  • fin.close()가 명시적으로 호출되지 않았지만 위의 코드는 아래 코드와 동치임.
fin = open('file_path', 'wt')
fin.write('test!') 
fin.close()
728x90