[패스트캠퍼스 환급챌린지]딥러닝/Chapter 3. 파이썬

[패스트캠퍼스]Chapter 3. 딥러닝을 위한 파이썬 03-11 파일 입출력

포리셔 2023. 4. 17. 13:30

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 파일.

실행 후 result.txt를 열어보면 다음과 같이 데이터가 기록되어 있는 것을 알 수 있습니다.

반대로 데이터를 읽을 때는 readlines() 함수를 이용해 파일의 모든 줄을 한꺼번에 읽을 수 있습니다. 참고로, readlines() 함수는 각 줄을 그대로 읽어들이기 때문에 줄바꿈 기호가 포함됩니다. 이 때문에 줄바꿈 기호가 있을 경우. 별도의 후처리 함수를 사용하지 않으면 두 줄씩 줄바꿈이 수행됩니다. 줄바꿈 기호를 생략하고 싶다면 strip() 함수를 이용해 추가적인 후처리를 해줘야 합니다.
예제 코드를 보기에 앞서, 이 코드로 열람할 data.txt 파일을 먼저 만들어줘야 합니다. 저는 윈도우 환경이라서 간단하게 메모장을 이용해 txt 파일 하나를 만들었습니다.

data.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")

 

http://bit.ly/3Y34pE0

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

* 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.