1. 파일 입출력

header

파이썬은 데이터를 다루는 데 아주 강력한 도구예요. 데이터를 다루려면 ‘파일’에서 정보를 가져오거나(입력), 파일에 새로운 정보를 저장하는(출력) 방법을 알아야 합니다.

  • 입력(Input): 파일에서 데이터를 프로그램으로 읽어오기
  • 출력(Output): 프로그램의 데이터를 파일에 저장하기

프로그램이 노트를 펴서 내용을 읽거나, 새로운 내용을 쓰는 과정이라고 생각하면 쉬워요! 😉


1. 파일 열고 닫기: open()with

파일을 읽거나 쓰려면, 가장 먼저 파일을 열어야 합니다. 파이썬에서는 open() 함수를 사용해요.

open("파일이름", "모드")

‘모드’는 파일을 어떤 목적으로 열지 알려주는 신호와 같아요.

모드 기능 설명
r 읽기 (read) 파일의 내용을 읽기만 할 때 사용해요.
w 쓰기 (write) 파일에 내용을 쓸 때 사용해요. 주의! 기존 내용은 모두 사라지고 새로 써져요.
a 추가 (append) 파일의 맨 끝에 새로운 내용을 추가해요. 기존 내용이 안전하게 유지돼요.


💡 가장 안전하고 편한 방법: with

파일 작업이 끝나면 반드시 close()로 닫아줘야 해요. 하지만 깜빡하기 쉽죠.
with 구문을 사용하면 작업이 끝났을 때 파이썬이 알아서 파일을 닫아줘서 아주 편리하고 안전하답니다.
앞으로는 항상 with를 사용하세요!

# 'with' 블록이 끝나면 memo.txt 파일은 자동으로 닫힙니다.
with open("memo.txt", "w") as file:
    file.write("with 구문을 사용하면 정말 편해요!")
파일을 열 때 흔히 만나는 오류들
  • FileNotFoundError: 파일이 존재하지 않을 때 발생해요.
  • PermissionError: 파일에 접근할 권한이 없을 때 발생해요.
  • IsADirectoryError: 파일이 아니라 폴더(디렉토리)를 열려고 할 때 발생해요.

2. 파일 내용 읽기

파일을 ‘r’ 모드로 열면 내용을 읽을 수 있어요.

  • read(): 파일 전체 내용을 하나의 문자열로 통째로 읽어와요.
  • readlines(): 파일의 모든 줄을 각각의 문자열로 만들어 리스트에 담아줘요.
  • readline(): 파일에서 딱 한 줄만 읽어와요. (자주 쓰이진 않아요.)
# memo.txt 파일에 아래 내용이 저장되어 있다고 상상해보세요!
# 첫 번째 줄입니다.
# 두 번째 줄입니다.

with open('memo.txt', 'r') as f:
    # 1. read()로 전체 읽기
    content = f.read()
    print("--- read() 결과 ---")
    print(content)

with open('memo.txt', 'r') as f:
    # 2. readlines()로 한 줄씩 리스트에 담아 읽기
    lines = f.readlines()
    print("--- readlines() 결과 ---")
    print(lines) 
    # 결과: ['첫 번째 줄입니다.\n', '두 번째 줄입니다.']

3. 파일에 내용 쓰기

파일에 글자를 쓰려면 ‘w’ 모드‘a’ 모드로 열어야 해요.

  • w 모드 (덮어쓰기): 파일의 모든 내용을 지우고 처음부터 새로 써요.
  • a 모드 (이어쓰기): 기존 내용 맨 끝에 새로운 내용을 추가해요.
# "w" 모드: 기존 내용을 모두 지우고 새로 쓰기
with open("memo.txt", "w") as f:
    f.write("이 내용만 남을 거예요.\n")

# "a" 모드: 기존 내용에 이어서 추가하기
with open("memo.txt", "a") as f:
    f.write("이 내용은 뒤에 추가돼요.\n")

4. 사용자에게 직접 입력받기: input()

파일뿐만 아니라 사용자에게 직접 키보드로 입력을 받을 수도 있어요. 이때는 input() 함수를 사용해요.

중요‼️ input()으로 받은 값은 항상 문자열(string) 타입이에요.

만약 숫자로 사용하고 싶다면 int()를 이용해 숫자로 변환해줘야 합니다.

name = input("이름을 입력하세요: ")
print(f"안녕하세요, {name}님!")

# input()은 문자열을 반환하므로, 숫자로 바꿔줘야(형 변환) 계산이 가능해요.
age_str = input("나이를 입력하세요: ")
age_int = int(age_str) 
print(f"내년에는 {age_int + 1}살이 되시는군요!")

5. 종합 연습문제

예제 파일 다운로드

문제 1

memo1.txt 파일을 한 줄씩 읽어서 화면에 출력하세요.

정답 보기

파일 객체는 for문과 함께 사용하면 한 줄씩 자동으로 읽어올 수 있어 매우 편리합니다.


    with open('memo1.txt', 'r') as f:
      for line in f:
        print(line.strip()) # .strip()은 줄 끝의 불필요한 공백이나 줄바꿈 문자를 제거합니다.
  

문제 2

hello.txt 파일에서 “Python”이라는 단어가 포함된 줄만 찾아서 출력하세요.

정답 보기

    with open("hello.txt", "r") as f:
      for line in f:
        if "Python" in line:
          print(line.strip())
  

문제 3

scores.txt 파일에는 이름,점수 형식으로 데이터가 저장되어 있습니다. 각 학생의 점수를 출력하고, 총점과 평균 점수를 계산하여 마지막에 출력하세요.

정답 보기

    total_score = 0
    student_count = 0

    with open("scores.txt", "r") as f:
      for line in f:
        name, score_str = line.strip().split(",")
        score = int(score_str) # 쉼표로 분리한 점수(문자열)를 숫자로 변환

    print(f"{name} 학생 점수: {score}")

    total_score += score
    student_count += 1
    average = total_score / student_count
    print(f"\n총점: {total_score}")
    print(f"평균: {average}")
  

문제 4

사용자에게 ‘과목 점수’ 형식으로 입력을 받아 딕셔너리에 저장하고, 사용자가 “exit”를 입력하면 파일(my_scores.txt)에 그 내용을 저장하는 프로그램을 만드세요.

정답 보기

    scores = {}

    while True:
      data = input("과목과 점수를 입력하세요 (예: 국어 90, 종료: exit): ")

    if data == "exit":
      break

    subject, score = data.split()
    scores[subject] = int(score)

    print("\n입력된 점수:", scores)

    파일에 딕셔너리 내용 저장하기
    with open("my_scores.txt", "w") as f:
      for subject, score in scores.items():
        f.write(f"{subject},{score}\n")

    print("my_scores.txt 파일이 생성되었습니다.")