본문 바로가기
파이썬/기초 학습

Day 8: 파일 입출력 (File I/O) 추가학습

by CBROJIN 2025. 8. 3.

1) 학습 요약표

학습 내용 설명
파일 입출력의 개념 프로그램이 외부 데이터와 주고받기 위해 파일을 읽거나 쓰는 작업
파일 읽기: read(), readline(), readlines() 전체/한 줄/리스트 형태로 파일 내용 읽기
파일 쓰기: write() 문자열만 작성 가능. 반복문 활용 가능
파일 모드: 'r', 'w', 'a' 읽기, 새로쓰기, 이어쓰기 용도로 모드 지정
with open() 사용 파일 자동 닫힘, 예외에도 안전함
flush() 파일 버퍼를 강제로 저장장치에 기록
파일 존재 여부 확인 os.path.exists()로 파일 유무 확인 가능
예외 처리 try-except로 파일 오류 방지
사용자 입력 → 리스트 저장 input(), list.append() 반복 활용
map() 함수 활용 리스트 등 반복가능 객체에 동일 함수 일괄 적용
 

2) 이론 학습

1. 파일입출력의 개념 및 필요성

파일 입출력은 프로그램이 외부와 데이터를 주고받는 기본 수단입니다.

  • 파일을 통해 데이터를 저장하거나 불러와 재사용할 수 있음
  • 네트워크 장비 로그 저장, 설정 파일 읽기, 결과 출력 등에 활용
nums = input("세 개의 숫자를 띄어쓰기로 입력하세요: ").split()
nums = list(map(int, nums))
result = 0

operator = input("""
1. 덧셈
2. 뺄셈
3. 곱셈
4. 나눗셈
선택: """)

if operator == "1":
    result = nums[0] + nums[1] + nums[2]
elif operator == "2":
    result = nums[0] - nums[1] - nums[2]
elif operator == "3":
    result = nums[0] * nums[1] * nums[2]
elif operator == "4":
    result = nums[0] / nums[1] / nums[2]
else:
    print("잘못된 입력입니다.")

with open("result.txt", 'w') as f:
    f.write(f"연산 결과: {result}\n")
 

2. map() 함수 활용

map(함수, 반복가능한 객체)의 형태로 각 요소에 동일한 작업을 수행할 수 있습니다.

  • 문자열 처리, 숫자 계산 등 일괄 처리에 효과적
def func(a):
    return a * 2

nums = [1, 2, 3, 4]
res = list(map(func, nums))
print(res)
 

3. 파일 열기/생성 및 열기 모드 설명

open("파일명", 모드)로 파일을 엽니다.

  • 'r': 읽기 전용, 파일이 없으면 오류
  • 'w': 쓰기 전용, 기존 파일이 있으면 덮어씀
  • 'a': 추가 모드, 기존 내용 유지하고 덧붙임
f = open("test_log.txt", 'w')
f.write("로그 시작\n")
f.close()
 

4. write(): 문자열만 가능

write()는 문자열만 저장할 수 있으므로, 숫자 등은 str()로 변환 필요합니다.

score = 85
f = open("score.txt", 'w')
f.write(str(score))
f.close()
 

5. 반복문을 활용한 파일 쓰기

반복문을 통해 여러 줄을 파일에 저장할 수 있습니다.

f = open("status.txt", 'w')
for i in range(1, 6):
    f.write(f"Switch{i} 상태: 정상\n")
f.close()
 

6. 파일 읽기 함수들: read(), readline(), readlines()

  • read(): 파일 전체를 하나의 문자열로 읽음
  • readline(): 한 줄씩 읽고 문자열 반환
  • readlines(): 모든 줄을 리스트로 반환
with open("status.txt", 'r') as f:
    print("전체 내용:", f.read())

with open("status.txt", 'r') as f:
    print("첫 줄:", f.readline())

with open("status.txt", 'r') as f:
    print("리스트로 전체:", f.readlines())
 

7. 파일을 while문으로 읽기

파일 줄 수를 모를 때 while문과 readline() 조합 활용

f = open("status.txt", 'r')
while True:
    line = f.readline()
    if not line:
        break
    print("읽은 줄:", line.strip())
f.close()
 

8. 사용자 입력을 리스트에 저장하기

엔터만 입력하면 입력 종료. 리스트에 저장됨

ip_list = []
while True:
    ip = input("장비 IP 입력 (종료: 엔터): ")
    if not ip:
        break
    ip_list.append(ip)
print("입력된 IP 목록:", ip_list)
 

9. 쓰기(w) vs 추가(a) 모드 차이

쓰기 'w'는 기존 내용 덮어쓰기, 추가 'a'는 기존 뒤에 이어 작성

 

  • 'w' 모드는 파일을 열 때 한 번만 기존 내용을 전부 지우고 새로 시작.
  • 그다음 f.write()를 여러 번 호출하면, 덮어쓰기(X), 이어쓰기(O) 방식으로 계속 파일에 내용이 들어간다.

 

with open("log.txt", 'w') as f:
    f.write("로그 시작\n")

with open("log.txt", 'a') as f:
    f.write("로그 이어쓰기\n")

with open("log.txt", 'r') as f:
    print(f.read())
 

10. with open() 사용 이유

파일을 열고 자동으로 닫아주는 안전한 방법

with open("safe_log.txt", 'w') as f:
    f.write("with 구문 예시\n")
 

11. flush() 함수 사용

버퍼 내용을 강제로 저장소에 기록. 실시간 로그 등에 사용

f = open("temp_write.txt", 'w')
f.write("첫 줄 기록 중...\n")
f.flush()
input("계속하려면 엔터: ")
f.write("두 번째 줄 저장 완료\n")
f.close()
 

12. 파일 존재 여부 확인 (os.path.exists)

파일 존재 여부를 확인하고 처리 흐름 제어

import os

if os.path.exists("config.yaml"):
    print("[존재함] 설정 파일 발견")
else:
    print("[없음] 새로 생성 예정")
 

13. 예외 처리로 안전한 파일 열기

파일이 없거나 권한이 없을 경우 오류를 예방함

try:
    with open("unknown.txt", 'r') as f:
        print(f.read())
except FileNotFoundError:
    print("[오류] 파일이 존재하지 않습니다.")
except PermissionError:
    print("[오류] 파일 권한 부족")

 

3) 종합 실습 과제

실습 1: 사용자 입력을 받아 계산 결과 파일에 저장하기

문제 설명: 사용자로부터 두 개의 정수를 입력받고, 사칙연산 기호(+,-,*,/) 중 하나를 입력받아 계산 결과를 파일 calc_log.txt에 저장하세요.

실습 2: 단어 목록을 대문자로 바꿔 파일에 저장하기

문제 설명: 사용자로부터 단어를 여러 개 입력받고, 대문자로 변환하여 words_upper.txt 파일에 줄마다 저장하세요.

실습 3: 주간 일정 계획 입력 및 파일 저장

문제 설명: 사용자로부터 월~금요일까지의 각 요일 일정 하나씩 입력받아 weekly_plan.txt 파일에 저장하고, 다시 그 파일을 읽어 출력하세요.

실습 4: 기존 파일에 로그 이어쓰기

문제 설명: log_history.txt 파일에 사용자 로그 내용을 입력받아 추가 모드로 계속 저장하세요. 종료 입력 시 종료됩니다.

실습 5: 저장된 단어 수 세기

문제 설명: 파일 words_upper.txt에서 저장된 단어의 개수를 출력하세요.