Application/Python

[Python] 파이썬 파일 읽기와 쓰기: open, read, write 한 번에 정리

devsalix 2026. 5. 4. 08:55
728x90

파이썬 파일 읽기와 쓰기: open, read, write 한 번에 정리

지난번에 모듈 가져다 쓰는 법까지 봤죠. 그러면서 한 가지 답답한 점, 혹시 느끼셨을지 모르겠어요.

지금까지 짜본 코드들은 프로그램 끄는 순간 데이터가 다 날아가요. 변수에 아무리 잘 넣어둬도 파이썬 창 닫으면 끝이에요.

근데 평소에 쓰는 프로그램은 안 그렇잖아요. 메모장에 적어두면 내일 켜도 그대로고, 엑셀도 저장만 해두면 한 달 뒤에 열려요. 그게 다 파일이라는 형태로 컴퓨터 어딘가에 적혀있어서 그래요.

오늘은 파이썬으로 그 파일을 직접 읽고 쓰는 방법을 볼게요.


파일 다루는 흐름은 노트랑 똑같아요

코드 보기 전에 잠깐만요.

파일을 그냥 노트 한 권이라고 생각하시면 돼요. 노트에 뭔가 적으려면 보통 이런 순서를 거치죠.

  1. 노트를 편다 (open)
  2. 읽거나 쓴다 (read / write)
  3. 다 했으면 덮는다 (close)

파이썬도 정확히 이 순서예요. 단어만 영어로 바뀐 것뿐이에요.


 

파이썬 open 함수, 일단 한번 써보기

가장 단순한 예제부터 보여드릴게요. 메모 한 줄을 파일로 저장하는 코드예요.

# 'memo.txt' 파일을 '쓰기 모드'로 연다
file = open('memo.txt', 'w')

# 파일 안에 글자를 쓴다
file.write('파이썬 공부 시작!')

# 다 썼으면 파일을 닫는다
file.close()

 

이걸 실행하면 파이썬 파일이 있는 폴더에 memo.txt가 짠 하고 생겨요. 열어보면 이렇게 적혀 있을 거예요.

파이썬 공부 시작!

 

여기서 open()에 두 가지를 넣어줬어요. 파일 이름이랑 모드예요.


모드는 세 개만 알면 됩니다

처음 보면 모드가 뭔가 싶으실 텐데, 그냥 "이 파일을 어떻게 쓸 거냐" 알려주는 거예요.

모드 의미 특징
'r' read (읽기) 파일을 읽기만 함 (기본값)
'w' write (쓰기) 기존 내용 다 지우고 새로 씀
'a' append (추가) 기존 내용 뒤에 이어서 씀

여기서 진짜 조심하셔야 하는 게 'w' 모드예요.

memo.txt에 중요한 내용이 잔뜩 있는 상태에서 open('memo.txt', 'w')를 해버리면요. 네, 다 날아갑니다. 새로 쓰는 거라서 기존 내용을 통째로 지워버려요.

저도 이거 모르고 한참 작업한 파일을 한 방에 날려본 적이 있거든요. 진짜 허무하더라고요.

기존 내용 뒤에 그냥 추가하고 싶으시면 'a' 모드를 쓰시면 돼요.

# 'a' 모드는 기존 내용 뒤에 덧붙임
file = open('memo.txt', 'a')
file.write('\n오늘은 파일 입출력 공부 중')
file.close()

 

\n은 줄바꿈이에요. 안 넣으면 기존 글자랑 딱 붙어버려요.


파이썬 파일 읽기, read와 한 줄씩 읽기

쓰는 건 됐고, 읽는 걸 볼게요.

# 파일 전체를 한 번에 읽기
file = open('memo.txt', 'r')
content = file.read()
print(content)
file.close()

 

read()는 파일 내용을 통째로 가져와서 문자열로 돌려줘요. 짧은 파일은 이게 제일 편합니다.

근데 파일이 엄청 클 때는요? 10만 줄짜리 로그 파일을 한 번에 다 읽으면 메모리가 휘청거려요. 그럴 땐 한 줄씩 읽는 게 낫습니다.

# 한 줄씩 반복해서 읽기
file = open('memo.txt', 'r')
for line in file:
    print(line)
file.close()

 

for line in file: 이 한 줄로 파일을 한 줄씩 알아서 넘겨줘요. 실무에서 제일 많이 쓰는 방법이에요.

한 가지 짚고 갈게요. 한 줄씩 읽으면 줄 끝에 \n이 같이 따라와서, 출력하면 줄바꿈이 두 번 일어난 것처럼 보여요. 헷갈리시는 분 진짜 많거든요. \n 빼고 싶으면 line.strip() 쓰시면 됩니다.


close 까먹으면요? with문이 답입니다

위 예제 보시면 마지막에 항상 file.close() 적었죠.

근데 솔직히 이거 자꾸 까먹어요. 저도 그래요. close 안 해도 당장은 별일 없어 보이거든요.

문제는 close를 안 하면 파일이 계속 "열린 상태"로 남아요. 다른 프로그램이 그 파일을 못 만지거나, 데이터가 제대로 저장 안 되는 일도 생깁니다.

그래서 파이썬에는 with 문이라는 게 있어요.

# with 문을 쓰면 close()를 자동으로 해줌
with open('memo.txt', 'r') as file:
    content = file.read()
    print(content)
# 여기서 file은 자동으로 닫힘

 

이 블록 안에서 파일을 다루다가 블록을 빠져나가면 파이썬이 알아서 close()를 호출해줘요. 까먹을 일 자체가 없어지는 거죠.

앞으로 파일 다룰 때는 그냥 무조건 with 문 쓴다고 생각하세요. 실무에서도 with 문이 표준이에요.


한글이 깨진다면 encoding='utf-8'

이거 한국 사람이라면 무조건 한 번은 만나는 문제예요.

윈도우에서 한글 파일을 그냥 열다가 가끔 이런 에러가 나요.

UnicodeDecodeError: 'cp949' codec can't decode byte...

 

뭔가 무서워 보이지만, 결국 "이 파일에 든 글자를 못 읽겠어"라는 뜻이에요. 한글을 어떤 방식으로 저장했는지 파이썬이 헷갈리는 거죠.

해결법은 의외로 간단해요. encoding='utf-8' 한 줄만 추가하시면 됩니다.

# 한글 파일은 encoding='utf-8'을 꼭 붙여주세요
with open('일기.txt', 'w', encoding='utf-8') as file:
    file.write('오늘 파이썬을 배웠다.\n생각보다 재미있었다.')

with open('일기.txt', 'r', encoding='utf-8') as file:
    print(file.read())

 

한글이 들어가는 순간 encoding='utf-8'. 그냥 습관처럼 붙이세요.


자주 만나는 에러들

파일 다루다 보면 거의 무조건 만나는 에러가 몇 개 있어요. 미리 알아두면 당황 안 하실 거예요.

# 없는 파일을 열려고 하면?
with open('없는파일.txt', 'r') as file:
    print(file.read())
# FileNotFoundError: [Errno 2] No such file or directory: '없는파일.txt'

 

FileNotFoundError는 말 그대로 파일이 없을 때 나요. 파일명 오타나 경로를 잘못 적은 경우가 대부분이에요.

PermissionError는 읽기 전용 파일을 쓰기 모드로 열거나, 권한 없는 폴더에 쓰려고 할 때 나요.

UnicodeDecodeError는 방금 말씀드린 한글 인코딩 문제고요.

이런 에러가 났을 때 프로그램이 그냥 죽어버리지 않게 우아하게 처리하는 방법이 있어요. 그게 바로 다음 글 주제예요. 살짝 예고편이었습니다.


실습: 나만의 일기장 만들기

배운 걸로 작은 일기장 프로그램을 만들어볼게요.

# 사용자에게 오늘 일기를 받아서 파일에 추가 저장
오늘일기 = input('오늘 있었던 일을 적어보세요: ')

# 'a' 모드로 열어서 기존 일기 뒤에 덧붙이기
with open('나의일기.txt', 'a', encoding='utf-8') as file:
    file.write(오늘일기 + '\n')

print('일기가 저장됐어요!')

# 지금까지 쓴 일기 전부 보여주기
print('\n--- 지금까지 쓴 일기 ---')
with open('나의일기.txt', 'r', encoding='utf-8') as file:
    print(file.read())

 

직접 실행해보세요. 여러 번 돌려서 일기 몇 개 쌓아보시면 'a' 모드 감이 확 옵니다.

여기서 한 발 더 나가고 싶으시면, 일기 적은 날짜도 같이 저장되게 만들어보세요. 힌트는 datetime 모듈이에요. 지난번에 모듈 가져오는 법 배웠죠.


다음 글로 넘어가기 전에

with open(...) as file: 이 패턴 하나만 손에 익으면 파일 입출력은 거의 끝났다고 보셔도 돼요.

그런데 막상 실전에서 파일 다루다 보면 별의별 에러를 다 만나요. 파일이 없거나, 인코딩이 안 맞거나, 권한이 없거나. 그때마다 프로그램이 그냥 멈춰버리면 좀 곤란하잖아요.

다음 글에서는 이런 상황에서 프로그램이 죽지 않고 버티게 만드는 예외 처리(try/except)를 다뤄볼게요. 파일 입출력이랑 거의 세트로 쓰이는 기능이에요.


 


제 글이 도움이 되셨다면 댓글 & 공감 부탁드려요 😀

 

 
728x90