안녕하세요. 언휴예요.
이번 강의는 Python에서 파일 입출력 중에서도 입출력에 사용할 파일을 여는 것과 닫는 것을 살펴볼거예요. 그리고 파일을 열었을 때 반환하는 파일 개체의 속성들도 간략하게 살펴볼 거예요.
Python에서는 내장 함수 open을 제공하고 있어요. 이름에서 알 수 있듯이 파일을 열 때 사용하는 내장 함수입니다. 열기 작업을 성공하면 oepn 함수는 파일 개체를 반환하며 이 후에 작업은 파일 개체의 멤버 메서드를 이용하여 쓰기, 읽기, 닫기 등의 작업을 수행할 수 있어요.
먼저 내장 함수 open을 살펴보기로 해요.
파일 개체 변수 = open(파일명[, 접근 모드, 버퍼링])
open 함수는 작업할 파일명을 입력 인자로 전달합니다. 선택적으로 접근 모드와 버퍼링 정책을 전달할 수 있어요.
접근 모드는 해야 할 작업 목적에 맞게 읽기 전용, 쓰기 전용, 읽기/쓰기 등을 선택할 수 있어요. 사용할 수 있는 모드는 r, w, a, b, + 의 조합입니다. 이 중에 b와 +는 단독으로 표현할 수 없고 반드시 r, w, a 중에 하나는 표현해야 합니다. r은 읽기, w는 쓰기, a는 추가, b는 바이너리 포멧, + 읽기/쓰기를 의미합니다. 만약 open 함수에 접근 모드를 전달하지 않으면 읽기 전용입니다.
- 파일이 없을 때
open 함수에 없는 파일명을 인자로 전달하면 어떻게 동작할까요? 만약 w, a 모드라면 새로운 파일을 생성한 후에 해당 파일에 작업할 수 있는 파일 인스턴스를 반환합니다. 하지만 r 모드라면 예외를 발생합니다.
다음은 파일이 없을 때 r(읽기 전용) 모드로 open 함수를 호출하면 예외가 발생하는지 확인하는 코드입니다.
#파일 열기 및 닫기 - 없는 파일 읽기 전용으로 열기 try: fs = open("abc","r") print("파일 열기 성공") fs.close() except: print("파일 열기 실패")
위 코드에서 open 함수의 두 번째 인자를 w로 변경하여 실행해 보세요. 이 때는 파일 열기 성공과 함께 프로젝트 폴더에 파일을 새로 생성함을 확인할 수 있어요. 두 번째 인자를 a로 변경한 후에 실행할 때도 w모드일 때처럼 파일 열기 성공과 프로젝트 폴더에 파일을 새로 생성합니다.
- 파일에 내용이 있을 때
open 함수에 전달한 파일에 이미 내용이 있을 때는 어떻게 동작할까요? 만약 r 모드나 a 모드로 열면 정상적으로 열리며 내용에 변화는 없어요. 하지만 w 모드로 열면 기존 파일에 내용은 사라집니다.
메모장으로 a.txt 파일을 만들어 아무 내용이나 입력한 후에 다음의 코드를 작성하여 실행해 보세요. 실행하기 전에 a.txt 파일을 열고 있는 메모장 프로그램은 종료하세요. 실행한 후에 다시 메모장으로 a.txt 파일의 내용을 확인해 보세요. 비어있는 상태로 바뀌는 것을 확인할 수 있어요.
#파일 열기 및 닫기 - 내용이 있는 파일 쓰기 전용으로 열기 try: fs = open("a.txt","w") print("파일 열기 성공") fs.close() except: print("파일 열기 실패")
- 버퍼링
open 함수에 세 번째 인자는 버퍼링입니다. 0을 전달하면 버퍼링을 하지 않습니다. 1을 전달하면 line 버퍼링입니다. 1보다 큰 정수를 전달하면 full 버퍼링으로 전달한 값을 버퍼의 크기로 인식합니다. 음수를 전달하면 시스템 디폴트 버퍼링 정책을 사용합니다. 버퍼링에 관하여 보다 깊은 내용을 원하시면 Unix System Programming에 관한 레퍼런스를 참고하세요.
- 파일 개체의 상태 속성
파일 개체에는 파일의 상태를 확인할 수 있는 속성들이 있어요. 파일 이름을 확인할 때는 name, 접근 모드를 확인할 때는 mode, 닫혀 있는 상태인지 확인할 때는 closed를 사용하세요.
#파일 개체 상태 def ViewFileState(fs): print("=== View File State ===") print("파일명",fs.name) print("접근 모드:",fs.mode) print("닫혀 있는지:",fs.closed) try: fs = open("abc.txt","w") print("파일 열기 성공") ViewFileState(fs) fs.close() ViewFileState(fs) except: print("파일 열기 실패")