03-11 파일 입출력
머신러닝과 딥러닝 영역에서 모든 작업을 파이썬으로만 수행하는 것은 아닙니다. 다른 프로그램 또는 플랫폼에서 만들어진 자료를 파이썬으로 불러와 작업을 하는 것이 오히려 더 일반적이죠. 또한 학습이 끝난 머신러닝 모델이나 예측 결과 데이터를 파이썬 바깥으로 내보내는 작업도 흔히 있는 일입니다. 프로그램이 종료된 후에도 열람할 수 있게 데이터를 저장하는 것은 매우 중요하죠. 저장을 생활화합시다 이번 포스트에서는 이러한 파일 입출력에 대해 알아보겠습니다.
파일 객체
일반적으로 우리가 어떤 프로그램에서 데이터를 열고 닫을 때 GUI를 쓰는 것과 달리, 프로그래밍 언어 상에서 파일을 열고 닫을 때는 다소 비직관적이지만 널리 통용되는 방법이 있습니다. 파일의 주소에 접근한 후에 그 상태에서 파일의 내용을 읽고 쓰는 방식입니다. 파이썬에서는 open()
과 close()
함수를 이용하게 됩니다.
f = open("example.txt", "w")
f.close()
open()
함수는 그 자체로 새로운 파일 객체를 만들어내는 역할을 합니다. 열고자 하는 파일의 이름과 파일 모드를 인수로 넣어주면 해당 파일에 접근할 수 있으며, 기존의 파일을 열람하거나 새로운 파일을 생성하는 것이 가능합니다. 두 번째 인수에 해당하는 파일 모드는 다음과 같으며, 문자열 형태로 넣어야 합니다.
r
: 읽기(read) 모드 (파일 읽기)w
: 쓰기(write) 모드 (파일에 내용 쓰기)a
: 추가(append) 모드 (파일의 마지막에 새로운 내용 추가)
파일 출력
들어가기 전에: 파일 입출력을 하기 전에는 반드시
open()
함수를 이용해 파일에 접근해주셔야 합니다! 또한, 파일 입출력이 모두 끝난 후에는 반드시close()
를 이용해 파일을 닫아주셔야 에러를 막을 수 있습니다.
파일에 데이터를 쓸 때는 write()
함수를 사용합니다. 기본적으로 여러 줄에 걸쳐 데이터를 작성할 수는 있지만, 이 과정은 반드시 한 줄씩 입력하는 것으로 이루어지기 때문에 여러 줄을 입력할 때는 반복문의 도움이 필요합니다. 아래 예시에서 \n
은 줄바꿈 기호입니다.
f = open("result.txt", "w")
for line in range(1, 6):
data = f"{line}번째 줄\n"
f.write(data)
f.close()
실행 후 result.txt를 열어보면 다음과 같이 데이터가 기록되어 있는 것을 알 수 있습니다.
반대로 데이터를 읽을 때는 readlines()
함수를 이용해 파일의 모든 줄을 한꺼번에 읽을 수 있습니다. 참고로, readlines()
함수는 각 줄을 그대로 읽어들이기 때문에 줄바꿈 기호가 포함됩니다. 이 때문에 줄바꿈 기호가 있을 경우. 별도의 후처리 함수를 사용하지 않으면 두 줄씩 줄바꿈이 수행됩니다. 줄바꿈 기호를 생략하고 싶다면 strip()
함수를 이용해 추가적인 후처리를 해줘야 합니다.
예제 코드를 보기에 앞서, 이 코드로 열람할 data.txt
파일을 먼저 만들어줘야 합니다. 저는 윈도우 환경이라서 간단하게 메모장을 이용해 txt 파일 하나를 만들었습니다.
f = open("data.txt", "r", encoding='UTF-8')
lines = f.readlines()
for i in range(len(lines)):
line = lines[i].strip()
print(f"{i}번째 줄의 내용: {line}")
f.close()
참고로 strip()
함수를 이용하지 않으면 앞서 말한 것과 같이 줄바꿈 기호가 자동으로 포함되므로 두 줄씩 바뀌는 것을 볼수 있습니다.
f = open("data.txt", "r", encoding='UTF-8')
lines = f.readlines()
for i in range(len(lines)):
line = lines[i]
print(f"{i}번째 줄의 내용: {line}")
f.close()
파일 읽기
위 문단에서 설명한 readlines()
함수가 모든 줄을 읽어들인다면, 저 이름에서 소문자 s 하나를 뺀 readline()
함수는 파일의 데이터를 한 줄씩 읽어오는 데 사용됩니다. 이 함수 역시 readlines()
함수와 마찬가지로 각 줄을 출력할 때 줄의 맨 끝에 줄바꿈 기호가 포함되며, strip()
함수를 이용한 후처리를 해야 한 줄씩 줄바꿈이 수행됩니다. 아래 예제 코드에서 볼 수 있다시피, 결과는 readlines()
함수를 사용했을 때와 동일합니다.
f = open("data.txt", "r", encoding='UTF-8')
while True:
line = f.readline()
if not line:
break
else:
print(line.strip())
f.close()
한편, 파일 전체 내용을 불러들이는 함수가 하나 더 있는데 바로 read()
함수입니다. 얼핏 듣기엔 readlines()
함수와 다를 바가 없어보이지만, readlines()
함수가 readline()
함수를 여러 번 실행한 것에 지나지 않아 본질적으로 한 줄씩 읽어들인 것에 불과하다면, read()
함수는 전체 텍스트를 한꺼번에 불러들이는 차이점이 있습니다. 파일 전체의 내용을 하나의 문자열로 반환하기 때문에, 지나치게 용량이 큰 파일을 열거나 한다면 컴퓨터의 리소스를 극도로 소비한다는 문제가 있습니다.
f = open("data.txt", "r", encoding='UTF-8')
data = f.read()
print(data)
f.close()
파일 객체 자동으로 열고 닫기
open()
과 close()
함수는 이 파일 객체를 사용하겠다, 더 이상 사용하지 않겠다라고 컴퓨터에 알려주는 함수입니다. 그런데 이를 그대로 사용하면 코드도 길어질 뿐더러, 개발자도 사람이다 보니 실수로 close()
함수를 까먹고 쓰지 않아 에러가 발생할 수도 있습니다. 그래서 이 두 함수를 하나로 합친 문법이 있습니다. 바로 with ... as ...
구문입니다. 기본적인 구조는 아래와 같습니다.
with open(<파일 이름>, 파일 열기 모드) as f:
<파일 객체 f를 이용하는 코드>
file_name = "output.txt"
with open(file_name, "w") as f:
f.write("Hello world")
* 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'[패스트캠퍼스 환급챌린지]딥러닝 > Chapter 3. 파이썬' 카테고리의 다른 글
[패스트캠퍼스]Chapter 3. 딥러닝을 위한 파이썬 03-13 클래스의 이해와 활용 (0) | 2023.05.03 |
---|---|
[패스트캠퍼스]Chapter 3. 딥러닝을 위한 파이썬 03-12 함수의 이해와 활용 (0) | 2023.05.01 |
[패스트캠퍼스]Chapter 3. 딥러닝을 위한 파이썬 03-10 반복문 (0) | 2023.04.14 |
[패스트캠퍼스]Chapter 3. 딥러닝을 위한 파이썬 03-09 조건문 (0) | 2023.04.12 |
[패스트캠퍼스]Chapter 3. 딥러닝을 위한 파이썬 03-08 참과 거짓 자료형 (0) | 2023.04.10 |