아래 내용은 공부한 것을 정리하므로 틀린 내용이 포함되어 있을 수 있습니다.
1. try ~ finally 블록을 이용한 파일 처리
- 파일의 작업 흐름은
open()
내장함수로 파일을 열고, 파일 객체를 통해 파일을 작업하고, 파일 객체의close()
함수로 파일을 닫아야 합니다. - 파일을 닫지 않으면 데이터가 소실될 수 있습니다.
- 그렇기 때문에 파일을 다룰 때 일반적인 흐름은 아래와 같습니다.
-
try ~ finally절로 묶는 이유는 예외가 발생을 해도 finally절을 통해 반드시 파일을 close시킬 수 있기 때문입니다.
try: 변수 = open(파일경로, 옵션) ... 파일 조작 ... finally: 변수.close()
- 예제코드
try: f = open('test.txt', mode='wt', encoding='utf-8') f.write('파이썬으로 파일을 작성하고 있습니다.') f.write('newline 문자로 개행해봅니다.\n') f.write('개행이 잘되었나요?') finally: f.close()
2. with 블록
- 파일을 다룰 때 with 블록을 통해 명시적으로
close()
메소드를 호출하지 않고도 파일을 닫을 수 있습니다. - 파일 객체는 내부적으로
__enter__()
,__exit__()
가 구현이 되어 있습니다. - with 블록이 자동으로 블록을 종료할 때
__exit__()
메소드를 호출하며 파일을 close 시키게 됩니다.- 참고 링크 : http://effbot.org/zone/python-with-statement.htm
>>> f = open('test.txt', mode='rt', encoding='utf-8') >>> dir(r) ['_CHUNK_SIZE', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__' , '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__' , '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__' , '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_checkClosed', '_checkReadable' , '_checkSeekable', '_checkWritable', '_finalizing', 'buffer', 'close', 'closed', 'detach', 'encoding', 'errors' , 'fileno', 'flush', 'isatty', 'line_buffering', 'mode', 'name', 'newlines', 'read', 'readable', 'readline', 'readlines' , 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write', 'writelines']
- 참고 링크 : http://effbot.org/zone/python-with-statement.htm
- with 블록을 사용하면 위쪽 예제를 아래와 같이 간편하게 코드를 줄일 수 있습니다.
with open('test.txt', mode='wt', encoding='utf-8') as f: f.write('파이썬으로 파일을 작성하고 있습니다.') f.write('newline 문자로 개행해봅니다.\n') f.write('개행이 잘되었나요?') dosomething()