저번 표준 입출력에서는 모니터와 키보드를 통한 기본적인 입출력을 배웠습니다. 하지만, 표준 입출력을 제외하고도 컴퓨터는 다양한 방법을 통해 입출력이 가능합니다. 이번 시간에 배울 파일 입출력도 그중 하나로, 파일을 통해서 입출력이 이루어집니다.
파일이라는 말은 흔하게들 사용하지만 그것이 무엇을 뜻하는지는 잘 모르는 사람이 많습니다. 파일이란 컴퓨터에서 데이터 저장을 위해 사용되는 개념으로, 종류에 따라 텍스트 파일, 이미지 파일, 비디오 파일 등으로 구분됩니다.
파일을 읽고 쓰기 위해서는 세 가지가 필요합니다. 바로 이름, 확장자, 경로이죠. 이는 파일을 읽기 위해선 파일이 어디에 속해있는지, 또 어떤 방식으로 열면 좋을지 알아야 하기 때문입니다.
요소 | 정의 |
---|---|
이름 | 저장한/저장할 파일의 이름입니다. |
확장자 | 파일명에서 . 뒤에 붙는 것으로 파일의 종류를 나타냅니다. (.xlsx, .py 등) |
경로 | 파일이 컴퓨터 내 어디에 속해있는지 알려줍니다. |
파이썬에서 파일은 open() 함수를 통해서 생성됩니다.
f = open("sample.txt", mode='r', encoding='utf-8')
f.close()
open() 함수는 파일 경로와 파일 열기 모드, 인코딩 등을 입력받아 파일 객체를 반환하는 함수로, 내장함수 중 하나입니다. 매개변수들을 차례로 살펴보겠습니다.
파일 경로는 크게 두 가지 표기법으로 나뉩니다.
종류 | 정의 |
---|---|
절대경로 | 최상위 폴더를 기준으로 파일의 위치를 전달합니다. |
상대경로 | 특정 폴더을 기준으로 파일의 위치를 전달합니다. |
문서 폴더에 sample.txt를 생성한다고 가정했을 때, 파일의 절대경로와 상대경로는 다음과 같습니다.
절대경로: C:/Users/user/Documents/sample.txt
상대경로: ./sample.txt (파이썬 파일이 문서 폴더 내에 있을 때)
상대경로 사용법
상대경로는
.
과..
, 그리고/
로 경로를 지정합니다.
.
: 현재 파일이 위치한 폴더 경로입니다.
..
: 현재 폴더의 상위 폴더의 경로입니다.
파일명만 적는 경우, 작업하고 있는 폴더 내에서 파일이 생성되거나 열립니다.
파일 열기 모드는 어떤 용도로 파일을 생성할 건지 정하는 옵션입니다. 기본값은 r(읽기 모드)입니다.
모드 | 정의 |
---|---|
r (읽기 모드) | 파일을 읽기만 할 때 사용합니다. |
w (쓰기 모드) | 파일에 내용을 적을 때 사용합니다. (파일이 이미 존재할 경우, 내용을 삭제하고 새로 작성니다.) |
a (추가 모드) | 파일 마지막에 내용을 추가할 때 사용합니다. (파일이 이미 존재할 경우, 뒤에 이어서 작성합니다.) |
인코딩은 데이터를 컴퓨터가 이해할 수 있게 바꾸는 것을 의미합니다. 즉, 우리가 보고 이해할 수 있는 텍스트 파일 같은 것들을 0과 1로 구성된 데이터로 변환하는 작업이죠.
한국어로 된 파일의 경우 'UTF-8'이나 'EUC-KR' 을 주로 사용합니다.
open() 함수를 통해 기존에 있는 파일을 가져오거나 새로 만들었다면, 이번에는 생성한 파일 객체를 읽는 법에 대해 알아보겠습니다.
read() 메소드는 파일 전체 내용을 문자열로 리턴해줍니다.
f = open("./sample.txt") # sample.txt 파일이 있어야 합니다.
content = f.read()
print(content)
f.close()
readline() 메소드를 통해 한 줄씩 읽을 수 있습니다.
f = open("./sample.txt", encoding='utf-8')
# sample.txt의 모든 내용을 한 줄씩 출력
while True:
content = f.readline()
if not content:
break
print(line)
f.close()
readlines() 메소드는 파일 각각의 줄을 원소로 하는 리스트를 반환합니다.
# readline() 에서 다룬 코드와 같은 기능을 한다.
f = open("./sample.txt", encoding='utf-8')
for i in f.readlines():
print(i)
파일 쓰기는 write() 메소드를 통해서 가능합니다. write() 메소드는 f.write(str)
와 같은 형태로, 매개변수로 문자열을 입력받습니다.
f = open("./sample.txt", mode='w')
f.write("파일 입출력 연습\n")
f.write("테스트입니다.\n")
f.close()
for문과 같이 사용하여 여러 줄을 파일에 입력할 수도 있습니다.
f = open("./sample.txt", mode='w')
for i in range(1, 101):
f.write(f"숫자 {i}입니다.\n")
f.close()
기존 파일에 이어서 쓰고 싶을 때는 모드를 'a'로 설정하면 됩니다.
f = open("./sample.txt", mode='a') # sample.txt가 없으면 새로 만들고, 있으면 이어서 씁니다.
f.write("이건 이어서 쓰는 문장입니다.\n")
f.close()
앞선 코드들을 살펴보면 끝에 꼭 f.close()
를 붙이는 것을 확인할 수 있습니다. 이는 open() 함수로 열어준 파일 객체를 관련 작업이 끝나면 close() 메소드로 닫는 것입니다. 딱히 쓰지 않아도 프로그램이 끝날 때 자동으로 닫아주지만, 다른 작업을 하다가 오류가 발생할 수도 있기 때문에 파일 관련 작업이 끝나면 닫아주는 것이 좋습니다.
open() 함수와 close() 메소드를 매번 쓰는 건 굉장히 번거로운 일입니다. 때문에 파이썬에서는 with 구문을 통하여 작업이 끝나면 자동으로 파일을 닫게 해주고 있습니다. with 구문은 다음과 같은 구조로 이루어져 있습니다.
with open() as 파일 객체 이름:
파일 관련 실행문
코드를 통해 살펴보겠습니다.
with open("sample.txt", "r") as fr:
content = fr.read()
print(content)
좋은 글 감사합니다. 자주 올게요 :)