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
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를 얻는 처리(__enter__)가 자동으로 수행되며,
- 해당 block을 나갈 때
- 자동으로 해당 resource를 반환하는 처리(__exit__)가 수행된다.
구문은 다음과 같음.
# 다음 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()
Context Manager에 대한 보다 자세한 것은 다음 URL을 참고.
2024.11.27 - [Python] - [Py] Context Manager: with statement!
관련된 글들
2023.12.05 - [Python] - [Python] File Handling
'Python' 카테고리의 다른 글
[Python] binary file: write and read (0) | 2023.07.04 |
---|---|
[Python] Text File: read and write (0) | 2023.07.04 |
[Python] Regular Expression : 표현식 기초 및요약 (0) | 2023.07.03 |
[Python] venv : Python Virtual Envrionment (0) | 2023.06.30 |
[Python] pip 사용법 (0) | 2023.06.30 |