본문 바로가기
IT/파이썬 기초 완전 정복

파이썬 파일 입출력 다루기 (8)

by 지식 발전소 2024. 4. 20.
728x90
반응형

 

파일 입출력의 중요성

 

 

안녕하세요. 이번에는 파이썬 파일 입출력에 대해 알아보겠습니다. 프로그래밍에서 파일 처리는 매우 중요한 부분입니다. 왜 파일 입출력이 중요할까요? 데이터를 영구적으로 저장하고 불러오기 위해서입니다.

 

컴퓨터 메모리는 휘발성이라 전원이 꺼지면 데이터가 소멸됩니다. 하지만 파일에 기록된 데이터는 영구적으로 보관되므로 다음에 프로그램을 실행할 때 불러올 수 있습니다.

 

파일 입출력은 다음과 같은 경우에 필수적입니다.

  • 애플리케이션 사용자 데이터 저장 (고객 정보, 게임 기록 등)
  • 로그 파일 관리 (오류 기록, 프로그램 활동 기록)
  • 데이터 분석에 사용할 데이터 저장 및 불러오기
  • 설정 파일 관리 (프로그램 설정값 저장)
  • 문서 파일 생성 및 편집

파이썬에서는 파일 처리를 위해 내장 함수와 메서드를 제공합니다. 그렇다면 구체적으로 어떤 방식으로 파일 입출력을 수행할 수 있는지 알아보겠습니다.

 

파일 열기와 종료

먼저 파일을 열어야 읽기/쓰기 작업을 할 수 있습니다. 다음과 같이 open() 내장 함수를 사용합니다.

file = open("file_path/file_name.txt", "r")

 

open() 함수에는 두 개의 인자를 전달합니다.

  1. 파일 경로와 이름: 파일 경로를 포함한 완전한 파일명을 지정합니다.
  2. 모드(mode): 파일을 어떤 목적으로 열지를 지정합니다. r 은 읽기 모드(read), w는 쓰기 모드(write), a는 추가 모드(append)입니다.

파일을 열면 파일 객체가 반환되는데, 이 객체를 통해 파일에 대한 작업을 수행할 수 있습니다. 작업이 완료되면 아래와 같이 close() 메서드로 파일을 꼭 닫아주어야 합니다.

file.close()

하지만 파일을 닫는 것을 까먹으면 메모리 누수 등의 문제가 생길 수 있습니다. 이를 방지하기 위해 다음과 같이 with 문을 사용하는 것이 좋습니다.

with open("file_path/file_name.txt", "r") as file:
    # 파일 읽기 작업 수행
    ...
    
# with 블록을 벗어나면 자동으로 파일이 닫힘

with 문을 사용하면 블록이 종료되면서 파일이 자동으로 닫히므로 close()를 호출할 필요가 없어 안전합니다.

파일 읽기

파일을 열었다면 파일에서 데이터를 읽어올 수 있습니다. 어떤 방식으로 읽어올지에 따라 다음과 같은 메서드가 있습니다.

  • read(): 파일 전체를 문자열로 읽어옵니다.
  • readline(): 파일에서 한 줄을 읽어옵니다.
  • readlines(): 파일의 모든 줄을 요소로 갖는 리스트를 반환합니다.
# read() 사용 예시
with open("data.txt", "r") as file:
    contents = file.read()
    print(contents)
    
# readline() 사용 예시 
with open("data.txt", "r") as file:
    line = file.readline()
    while line:
        print(line.strip())  # 줄바꿈 문자 제거
        line = file.readline()
        
# readlines() 사용 예시
with open("data.txt", "r") as file:
    lines = file.readlines()
    for line in lines:
        print(line.strip())

위와 같이 파일 내용을 읽어올 수 있습니다. 상황에 맞게 적절한 메서드를 선택하면 됩니다. 대용량 파일이라면 read()보다는 readline()이나 readlines()를 사용하는 것이 메모리 관리에 유리합니다.

파일 쓰기

파일 쓰기는 두 가지 방식으로 할 수 있습니다. 하나는 새 파일을 생성하는 것이고, 다른 하나는 기존 파일에 추가하는 것입니다.

새 파일 생성하기

with open("new_file.txt", "w") as file:
    file.write("Hello, World!\n")
    file.write("This is a new file.")

위 코드는 "w" 모드로 열어 new_file.txt라는 새 파일을 생성하고 문자열을 기록합니다. write() 메서드를 사용하여 원하는 내용을 파일에 입력할 수 있습니다.

주의할 점은 "w" 모드로 열면 파일이 이미 존재할 경우 원래 내용이 삭제되고 새로 작성된다는 것입니다. 기존 내용을 유지하고 싶다면 "a" 모드로 열어야 합니다.

기존 파일에 추가하기

with open("existing_file.txt", "a") as file:
    file.write("\nNew content added.")

위 코드는 기존 existing_file.txt 파일을 "a" 모드로 열어 새로운 내용을 추가합니다. 파일의 마지막에 새 줄로 시작하여 "New content added."가 기록됩니다.

예외 처리와 모드 활용

파일 입출력 시에는 예외 상황이 발생할 수 있습니다. 예를 들어 파일 경로가 잘못되었거나 쓰기 권한이 없는 경우 등입니다. 이럴 때는 try/except 문을 사용하여 적절히 예외를 처리해야 합니다.

try:
    with open("nofile.txt", "r") as file:
        contents = file.read()
        print(contents)
except FileNotFoundError:
    print("파일을 찾을 수 없습니다.")

위 코드에서는 존재하지 않는 "nofile.txt" 파일을 열려고 하기 때문에 FileNotFoundError 예외가 발생하게 됩니다. except 블록에서 이 예외를 잡아내어 적절히 처리할 수 있습니다.

또한 파일 모드를 다양하게 활용하면 원하는 작업을 보다 유연하게 수행할 수 있습니다. "r+" 모드로 열면 읽기와 쓰기가 동시에 가능하며, "b" 모드를 추가하면 바이너리 모드로 열 수 있습니다. 텍스트가 아닌 이미지, 동영상 등의 바이너리 파일 입출력에는 "b" 모드를 사용하세요.

파일 입출력시 주의사항

파일 입출력은 많이 사용되는 만큼 주의해야 할 점들이 있습니다.

  1. 파일 종료 잊지 않기: with 문을 사용하지 않는다면 반드시 close()로 파일을 닫아야 합니다.
  2. 실수로 덮어쓰지 않기: "w" 모드로 파일을 열면 기존 내용이 모두 사라지므로 주의해야 합니다.
  3. 상대/절대 경로 확인: 파일 경로를 제대로 입력했는지 확인해야 합니다.
  4. 파일 읽기/쓰기 권한 확인: 파일에 대한 읽기/쓰기 권한이 있는지 확인해야 합니다.
  5. 예외 상황 고려하기: try/except로 예외 상황을 제대로 처리해야 합니다.

실전 예시

지금까지 배운 파일 입출력 기능을 실제로 활용해볼 예제를 살펴보겠습니다.

예시 1) 로그 파일 생성하기

import datetime

def write_log(message):
    now = datetime.datetime.now()
    timestamp = now.strftime("%Y-%m-%d %H:%M:%S")
    log_message = f"[{timestamp}] {message}\n"
    
    try:
        with open("app.log", "a") as file:
            file.write(log_message)
    except Exception as e:
        print(f"로그 파일 쓰기 오류: {e}")

# 사용 예시
write_log("프로그램 시작")
write_log("데이터 로딩 중...")
write_log("작업 완료")

위 코드는 write_log() 함수를 통해 현재 시간과 함께 로그 메시지를 "app.log" 파일에 기록합니다. 로그 파일은 프로그램 실행 과정을 기록하는 데 유용하게 사용됩니다.

예시 2) 학생 성적 데이터 저장 및 불러오기

students = []

def save_data():
    try:
        with open("students.txt", "w") as file:
            for student in students:
                file.write(f"{student['name']},{student['grade']}\n")
    except Exception as e:
        print(f"파일 쓰기 오류: {e}")

def load_data():
    try:
        with open("students.txt", "r") as file:
            for line in file:
                name, grade = line.strip().split(",")
                student = {"name": name, "grade": int(grade)}
                students.append(student)
    except Exception as e:
        print(f"파일 읽기 오류: {e}")

# 사용 예시
students.append({"name": "철수", "grade": 85})
students.append({"name": "영희", "grade": 92})

save_data()  # 파일에 저장

students.clear()  # students 리스트 비우기

load_data()  # 파일에서 불러오기

for student in students:
    print(f"{student['name']}: {student['grade']}점")

위 코드는 학생 이름과 성적 정보를 갖는 딕셔너리를 리스트에 저장합니다. save_data() 함수를 통해 이 정보를 "students.txt" 파일에 저장하고, load_data() 함수로 파일에서 정보를 다시 불러옵니다.

이렇게 파일 입출력을 활용하면 프로그램 실행 간에도 데이터를 유지할 수 있습니다. 마지막 출력에서는 이전에 저장된 학생 정보를 다시 불러와 출력합니다.

파일 입출력은 프로그래밍에서 많이 사용되는 기능이므로 기본 개념을 잘 익혀두시기 바랍니다. 이번 내용을 통해 파이썬으로 파일을 읽고, 쓰고, 관리하는 방법을 충분히 이해하셨기를 바랍니다.

참고 자료

[1] 박응용 박사, "혼자 공부하는 파이썬"

2] Python Software Foundation, "파일 입력과 출력 다루기"

[3] Jose Portilla, "파일 입출력과 예외 처리"

[4] Corey Schafer, "파이썬 입문 강좌: 파일 입출력과 처리"

 

 

한 고대 문서 이야기

여기 한 고대 문서가 있습니다. 이 문서는 B.C. 1,500년 부터 A.D 100년까지 약 1,600 여 년 동안 기록되었습니다. 이 문서의 저자는 약 40 명입니다. 이 문서의 고대 사본은 25,000 개가 넘으나, 사본간 오

gospel79.tistory.com

 

유튜브 프리미엄 월 1만원 할인받고 월 4000원에 이용하는 방법

올해 5월부터 월 8000원 정도이던 유튜브 프리미엄 요금이 15000원 정도로 인상됩니다. 각종 OTT 서비스, ChatGPT 같은 서비스들이 늘어나다보니 이런 거 몇 개만 이용하더라도 월 이용요금이 5만원을

stock79.tistory.com

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

728x90
반응형

댓글