Python(파이썬) 기본 - 48. 파일 - finally & with 구문

아래 내용은 공부한 것을 정리하므로 틀린 내용이 포함되어 있을 수 있습니다.

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']
      
  • with 블록을 사용하면 위쪽 예제를 아래와 같이 간편하게 코드를 줄일 수 있습니다.
      with open('test.txt', mode='wt', encoding='utf-8') as f:
          f.write('파이썬으로 파일을 작성하고 있습니다.')
          f.write('newline 문자로 개행해봅니다.\n')
          f.write('개행이 잘되었나요?')
      dosomething()