Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 파일 입출력 기초: open() 함수로 파일 열고 close()로 닫기

지금까지는 표준 입력(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보다 큰 정수를 지정하면 해당 크기의 버퍼로 버퍼링이 진행되며, 음수를 지정하면 시스템 기본값(기본 동작)이 적용됩니다.

파일 열기 모드의 종류

번호모드 및 설명
1r
읽기 전용으로 파일을 엽니다. 파일 포인터는 파일의 맨 앞에 위치하며, 기본 모드입니다.
2rb
바이너리(binary) 형식으로 읽기 전용 파일을 엽니다. 파일 포인터는 파일의 맨 앞에 위치합니다.
3r+
읽기와 쓰기를 모두 지원하는 형태로 파일을 엽니다. 파일 포인터는 파일의 맨 앞에 위치합니다.
4rb+
바이너리 형식으로 읽기와 쓰기를 모두 지원하는 형태로 파일을 엽니다. 파일 포인터는 파일의 맨 앞에 위치합니다.
5w
쓰기 전용으로 파일을 엽니다. 파일이 이미 존재하면 기존 내용을 덮어쓰고, 존재하지 않으면 새 파일을 생성합니다.
6wb
바이너리 형식으로 쓰기 전용 파일을 엽니다. 파일이 존재하면 덮어쓰고, 없으면 새 파일을 생성합니다.
7w+
쓰기와 읽기를 모두 지원하는 형태로 파일을 엽니다. 기존 파일이 있으면 덮어쓰고, 없으면 읽기·쓰기용 새 파일을 생성합니다.
8wb+
바이너리 형식으로 쓰기와 읽기를 모두 지원하는 형태로 파일을 엽니다. 기존 파일이 있으면 덮어쓰고, 없으면 새 파일을 생성합니다.
9a
추가(append) 모드로 파일을 엽니다. 파일이 존재하면 파일 포인터는 파일의 맨 끝에 위치하며, 존재하지 않으면 쓰기용 새 파일을 생성합니다.
10ab
바이너리 형식으로 추가 모드 파일을 엽니다. 파일이 존재하면 포인터는 맨 끝에 위치하며, 없으면 새 파일을 생성합니다.
11a+
추가와 읽기를 모두 지원하는 형태로 파일을 엽니다. 파일이 존재하면 포인터는 맨 끝에 위치하며, 없으면 읽기·쓰기용 새 파일을 생성합니다.
12ab+
바이너리 형식으로 추가와 읽기를 모두 지원하는 형태로 파일을 엽니다. 파일이 존재하면 포인터는 맨 끝에 위치하며, 없으면 새 파일을 생성합니다.

파일 객체의 주요 속성

파일을 열어 파일 객체를 확보하면 해당 파일과 관련된 다양한 정보를 확인할 수 있습니다.

번호속성 및 설명
1file.closed
파일이 닫혀 있으면 true, 그렇지 않으면 false를 반환합니다.
2file.mode
파일이 열릴 때 사용된 접근 모드를 반환합니다.
3file.name
파일의 이름을 반환합니다.
4file.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!")
# 블록을 벗어나면 파일이 자동으로 닫힙니다.