지금까지는 표준 입력(stdin)과 표준 출력(stdout)을 통해서만 데이터를 읽고 썼습니다. 이번에는 실제 데이터 파일을 다루는 방법을 살펴보겠습니다.
Python은 기본적으로 파일을 조작하는 데 필요한 함수와 메서드를 제공합니다. 파일 객체(file object)를 활용하면 대부분의 파일 작업을 손쉽게 수행할 수 있습니다.
open() 함수란?
파일을 읽거나 쓰기 전에는 반드시 Python의 내장 함수인 open()으로 파일을 열어야 합니다. 이 함수는 파일 객체를 생성하며, 이후 파일 관련 각종 지원 메서드를 호출할 때 이 객체를 사용하게 됩니다.
문법(Syntax)
file object = open(file_name [, access_mode][, buffering])
각 매개변수의 의미는 다음과 같습니다.
- file_name − 접근하고자 하는 파일의 이름을 담고 있는 문자열 값입니다.
- access_mode − 파일을 여는 모드, 즉 읽기(read), 쓰기(write), 추가(append) 등을 결정합니다. 선택적 매개변수이며, 기본값은 읽기 모드(
r)입니다. - buffering − 값이 0이면 버퍼링이 일어나지 않고, 1이면 파일 접근 시 라인 단위 버퍼링이 수행됩니다. 1보다 큰 정수를 지정하면 해당 크기의 버퍼로 버퍼링이 진행되며, 음수를 지정하면 시스템 기본값(기본 동작)이 적용됩니다.
파일 열기 모드의 종류
| 번호 | 모드 및 설명 |
|---|---|
| 1 | r 읽기 전용으로 파일을 엽니다. 파일 포인터는 파일의 맨 앞에 위치하며, 기본 모드입니다. |
| 2 | rb 바이너리(binary) 형식으로 읽기 전용 파일을 엽니다. 파일 포인터는 파일의 맨 앞에 위치합니다. |
| 3 | r+ 읽기와 쓰기를 모두 지원하는 형태로 파일을 엽니다. 파일 포인터는 파일의 맨 앞에 위치합니다. |
| 4 | rb+ 바이너리 형식으로 읽기와 쓰기를 모두 지원하는 형태로 파일을 엽니다. 파일 포인터는 파일의 맨 앞에 위치합니다. |
| 5 | w 쓰기 전용으로 파일을 엽니다. 파일이 이미 존재하면 기존 내용을 덮어쓰고, 존재하지 않으면 새 파일을 생성합니다. |
| 6 | wb 바이너리 형식으로 쓰기 전용 파일을 엽니다. 파일이 존재하면 덮어쓰고, 없으면 새 파일을 생성합니다. |
| 7 | w+ 쓰기와 읽기를 모두 지원하는 형태로 파일을 엽니다. 기존 파일이 있으면 덮어쓰고, 없으면 읽기·쓰기용 새 파일을 생성합니다. |
| 8 | wb+ 바이너리 형식으로 쓰기와 읽기를 모두 지원하는 형태로 파일을 엽니다. 기존 파일이 있으면 덮어쓰고, 없으면 새 파일을 생성합니다. |
| 9 | a 추가(append) 모드로 파일을 엽니다. 파일이 존재하면 파일 포인터는 파일의 맨 끝에 위치하며, 존재하지 않으면 쓰기용 새 파일을 생성합니다. |
| 10 | ab 바이너리 형식으로 추가 모드 파일을 엽니다. 파일이 존재하면 포인터는 맨 끝에 위치하며, 없으면 새 파일을 생성합니다. |
| 11 | a+ 추가와 읽기를 모두 지원하는 형태로 파일을 엽니다. 파일이 존재하면 포인터는 맨 끝에 위치하며, 없으면 읽기·쓰기용 새 파일을 생성합니다. |
| 12 | ab+ 바이너리 형식으로 추가와 읽기를 모두 지원하는 형태로 파일을 엽니다. 파일이 존재하면 포인터는 맨 끝에 위치하며, 없으면 새 파일을 생성합니다. |
파일 객체의 주요 속성
파일을 열어 파일 객체를 확보하면 해당 파일과 관련된 다양한 정보를 확인할 수 있습니다.
| 번호 | 속성 및 설명 |
|---|---|
| 1 | file.closed 파일이 닫혀 있으면 true, 그렇지 않으면 false를 반환합니다. |
| 2 | file.mode 파일이 열릴 때 사용된 접근 모드를 반환합니다. |
| 3 | file.name 파일의 이름을 반환합니다. |
| 4 | file.softspace print 사용 시 공백이 명시적으로 필요하면 false, 그렇지 않으면 true를 반환합니다. (Python 2 전용 속성으로, Python 3에서는 제거되었습니다.) |
예제
#!/usr/bin/python
# 파일 열기
fo = open("foo.txt", "wb")
print "Name of the file: ", fo.name
print "Closed or not : ", fo.closed
print "Opening mode : ", fo.mode
print "Softspace flag : ", fo.softspace실행 결과
Name of the file: foo.txt Closed or not : False Opening mode : wb Softspace flag : 0
위 예제는 Python 2 스타일의 print 문을 사용합니다. Python 3 환경에서는 다음과 같이 작성할 수 있습니다.
#!/usr/bin/python3
# 파일 열기
fo = open("foo.txt", "wb")
print("Name of the file: ", fo.name)
print("Closed or not : ", fo.closed)
print("Opening mode : ", fo.mode)close() 메서드
파일 객체의 close() 메서드는 아직 기록되지 않은 정보를 모두 디스크에 반영(flush)한 뒤 파일 객체를 닫습니다. 파일이 닫히면 더 이상 쓰기 작업을 수행할 수 없습니다.
Python은 파일 객체의 참조가 다른 파일로 재할당되면 자동으로 파일을 닫아주지만, close() 메서드를 직접 호출해 파일을 닫는 것이 좋은 습관입니다.
문법(Syntax)
fileObject.close()
예제
#!/usr/bin/python
# 파일 열기
fo = open("foo.txt", "wb")
print "Name of the file: ", fo.name
# 열려 있는 파일 닫기
fo.close()실행 결과
Name of the file: foo.txt
더 나은 방법: with 문 활용
최신 Python 코드에서는 with 문을 사용하는 것이 권장됩니다. with 블록이 종료되면 파일이 자동으로 닫히므로, close() 호출을 잊어버리는 실수를 방지할 수 있습니다.
with open("foo.txt", "w") as f:
f.write("Hello, Python!")
# 블록을 벗어나면 파일이 자동으로 닫힙니다.