파이썬은 데이터를 다루는 데 아주 강력한 도구예요. 데이터를 다루려면 ‘파일’에서 정보를 가져오거나(입력), 파일에 새로운 정보를 저장하는(출력) 방법을 알아야 합니다.
- 입력(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 파일이 생성되었습니다.")