❰파일 읽고 쓰기❱
-파일 읽고 쓰기에 대해 배워보십다.
▶파일 읽고 쓰기란?
컴퓨터의 저장 장치(하드 드라이브, SSD 등)에 있는 파일에 접근하여 데이터를 불러오거나(읽기) 저장하는(쓰기) 작업을 의미합니다.
쉽게 설명하면 , 여태까지 파이썬을 배우면서
입력은 input()을 사용하였고 입력은 사용자가 키보드와 같은 입력장치를 이용하여 실시간으로 전달
출력은 print()을 사용하여 input에 입력된 값을 화면이나 콘솔을 통해 보여주었으면
파일 읽고 쓰기는 입력과 출력을 파일을 통해 처리하는 것입니다.
데이터의 입출력이라는 큰 틀에서는 비슷하지만 입출력의 대상(통로)이 다르다는 점이 있습니다.
그리고 데이터를 파일 형식으로 저장해 두어 나중에도 다시 사용할 수 있다는 점이 다릅니다.
즉, input()으로 받은 내용은 print()로 출력하면 프로그램을 종료하거나 입력을 마치면 사라지지만,
파일 읽고 쓰기를 이용하면 저장장치에 데이터가 남아 프로그램을 종료해도 계속 유지됩니다.
눈으로 보이게 예제를 만들어 보면 우선, 기본구조는 아래 설명 할 것이기 때문에 차이를 예제로 봐주시면 되겠습니다.
아래는 input과 print입니다.
아래는 파일 읽고 쓰기를 활용한 예제입니다
예제를 보면서 더 쉽게 이해하시면 되겠습니다.
그럼 input과 파일 읽고 쓰기도 결국은 print출력을 사용하는데 파일 읽고 쓰기는 입력만 되는 게 아니냐 라는 생각을 하실 수 있으신데
파일 읽고 쓰기를 f.close()라는 형식으로 닫아주면 프로그램 자체에는 내용이 저장됩니다.
하지만 사람의 눈에 화면 및 콘솔에 보이게 하려면 반드시, print문을 사용하여야 하기 때문에 결국 마지막에 print문을 사용하는 것입니다. (프로그램의 내부에서 사용 시 print()는 필요 없습니다.)
✿파일 읽기 (Read)
파일 읽기는 파일에 담긴 내용을 파이썬 프로그램으로 가져오는 과정이며, 예를 들어,. txt 파일이나. csv 파일에 저장된 텍스트 데이터를 읽어와서 프로그램에서 처리하거나 화면에 보여줄 수 있습니다.
✿파일 쓰기 (Write)
파일 쓰기는 프로그램이 생성하거나 처리한 데이터를 파일에 저장하는 과정이며, 예를 들어, 프로그램이 계산한 결과를. txt 파일로 저장하거나, 새로운 사용자 정보를 데이터베이스 파일에 기록할 때 사용 할 수 있습니다.
▶파일 열고 닫기
파일 읽고 쓰기를하기 위해서는 먼저 파일을 열고 닫을 수 있어야 합니다
open() 함수는 파일을 열기 위해 사용하는 함수입니다.
. close() 함수는 파일을 닫기 위해 사용하는 함수입니다.
. close()는 독립된 함수 아니기 때문이며, 파일_객체. close를 써야 파일 객체를 닫는다라고 인식하기 때문입니다.
파일_객체 = open("파일 이름", "모드")
파일_객체.close()
open함수를 보면 두 가지의 인수를 받습니다.
파일 이름은 어떤 파일을 열지 지정하거나 어떤 파일을 생성할지 지정하는 것이며,
모드는 파일을 어떻게 다룰지 지정하는 법입니다(예 : 읽기, 쓰기, 추가 등)
그럼, 모드의 종류에 대해 알아보도록 합시다.
파일 열기 모드 | 설명 |
r(읽기 모드) | 파일을 읽기 위해 엽니다.(파일이 없으면 오류가 발생합니다) |
w(쓰기 모드) | 파일을 쓰기 위해 엽니다. (파일이 이미 있으면 내용을 모두 지우고 새로 쓰며. 파일이 없으면 새로 생성됩니다.) |
a(추가 모드) | 파일의 끝에 내용을 추가합니다(파일이 없으면 새로 생성됩니다.) |
x(단독 생성 모드) | 파일을 새로 생성합니다.( 파일이 이미 있으면 오류가 발생합니다) |
b(이진 모드) | 바이너리(바이트) 데이터를 읽거나 쓸 때 사용합니다. (이미지나 실행 파일 등을 다룰 때 유용합니다.) |
t(텍스트 모드) | 텍스트 데이터를 다룰 때 사용합니다.(기본값입니다.) |
wb(이진 쓰기 모드) | 텍스트가 아닌 바이너리(binary) 데이터를 파일에 쓸 때 사용하는 파이썬의 파일 모드입니다. |
rb(이진 읽기 모드) | 텍스트가 아닌 바이너리 데이터를 파일에서 읽어올 때 사용합니다. |
✔바이너리(binary)는 0과 1, 즉 컴퓨터가 이해하는 이진수 표현을 의미합니다.
✔바이너리 데이터는 사람이 읽을 수 있는 텍스트가 아니라, 컴퓨터 내부에서 비트 바이트 단위로 표현된 데이터입니다.
정리하면, 바이너리 데이터는 사람이 바로 읽기 힘들고 컴퓨터가 직접 다루는 0과 1의 패턴입니다.
파일 열고 닫기를 활용하여 파일을 읽어 보겠습니다.
파일을 읽고 닫는건 아래 코드로도 충분하지만, 아래 코드를 적용했을 때 사용자의 눈에는 보이지 않고 내부 프로그램에만 적용된다는 점이 있습니다.
file = open("pathunspecified.txt","r")
file.close()
사용자의 눈에 보이게 하기 위해 사용하는게 print(file.read())라는 코드를 사용합니다.
file = open("pathunspecified.txt","r")
print(file.read())
file.close()
말그대로print(file.read()) 파일이라는 객체를 읽어서 출력한다라는 의미 입니다.
아래 표를 통해 부가설명을 추가하겠습니다.
함수 종류 | 설명 |
open() | 파일 객체를 열기 및 만들기 |
read() | 파일을 내용을 메모리로 읽어오기(하지만, 1회성) |
print() | 읽어온 내용을 사용자의 눈에 보이도록 콘솔에 출력 |
close() | 파일 사용을 끝내고 운영체제에 반환 |
①경로를 지정하지 않은 상태에서 읽기
경로를 지정하지 않았을 때는 해당 프로젝트 폴더에 포함되어 있다고 인식하고 파일을 불러오게 됩니다.
만약 프로젝트 폴더에 파일이 존재하지 않는다면
FileNotFoundError: [Errno 2] No such file or directory: '파일명. txt'라는 오류가 발생합니다.
file = open("pathunspecified.txt", "r")
print(file.read())
file.close()
해당 코드에 맞춰서 작성했는데 오류가 발생하신 분들도 있을 실 겁니다.
해당 오류는 윈도우 파이썬 기본 인코딩은 cp949로 되어 있는데 생성된 메모장 파일은 UTF-8로 저장되어 있어 충돌이 일어 난 것입니다. (cp949와 utf-8에 대해서는 cs용어에서 따로 설명하겠습니다.)
그럼 해당 문제를 해결하기 위해서는 어떻게 해야하는지 아래 예제를 통해 확인하여 봅시다.
file = open("pathunspecified.txt", "r", encoding="utf-8")
print(file.read())
file.close()
encoding="utf-8"이라는 코드를 통하여 utf-8로 인식하게 해주시면 되겠습니다.
②경로를 지정하여 파일 열기
프로젝트 폴더가 아닌 외부 폴더에 있는 파일을 불러오도록 해보겠습니다
주의사항은 아래 설명을 봐주시면 되겠습니다.
✔만약SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape 경로에 관한 오류가 발생 하였을 시
/(슬래시)로 변경을 하던가, \\역슬래시를 두번 사용하여 파이썬에서 \로 읽게 해주시면 되겠습니다.
▶whit문
파일_객체 = open("파일 이름", "모드")
파일_객체.close()
여태까지 파일을 열고 닫을 때 위에 문장을 사용 하였다면
해당 구조를 더 안전하고 편리하게 사용하기 위해 파이썬에서 권장하는 with문에 대해 배워 보도록 하겠습니다.
with문은 블록이 끝날 때 자동으로 파일을 닫아줘서close()를 따로 호출 할 필요가 없습니다.
with open('파일명.txt', '모드') as 파일객체 :
print(파일객체.read())
whit과 open()방식의 차이입니다.
① 오류가 발생해도 파일이 안전하게 닫힘
일반적인open()방식은 작업 중에 예외(오류)가 발생하면f.close()가 실행되지 않을 수 있습니다. 이 경우, 파일이 제대로 닫히지 않아 데이터가 손실되거나, 다른 프로그램이 파일을 사용하지 못하게 되는 문제가 발생할 수 있습니다.
# 일반적인 open() 방식 (오류 발생 시 파일이 닫히지 않을 수 있음)
f =open('data.txt','w')
f.write('테스트 데이터')
# 이곳에서 오류가 발생하면 f.close()가 실행되지 않음
f.close()
그에 반해 with문은 어떤 오류가 발생하든 with 블록을 벗어나는 순간 자동으로 파일을 닫아줍니다.
# with 문 사용 방식 (오류 발생 여부와 관계없이 파일이 안전하게 닫힘)
with
open('data.txt','w')asf :
f.write('테스트 데이터')
# 이곳에서 오류가 발생해도, with 블록을 벗어나는 순간 파일은 자동으로 닫힘
② 코드가 더 간결하고 명확해짐
매번 open()과 close()를 짝지어 쓰는 번거로움이 사라져서 코드가 더 깔끔해집니다. 개발자가 close()를 잊어버릴 염려도 없습니다.
따라서 file = open(...) 방식으로 파일을 열기보다는, 대부분의 경우 with open(...) as file: 방식을 사용하는 것이 최적의 습관입니다.
쉽게 이해하면 스마트센서는 with, 직접 끄고 키는건 open()/close()방식으로 생각하시면 됩니다.
▶파일 쓰기모드
파일을 열어서 읽고 닫을 수 있게 되었으니 이제 파일의 내용을 써보겠습니다.
파일 읽기 모드는 read()라는 함수를 사용했으면, 파일 쓰기는 write()라는 함수를 사용 해보도록 하겠습니다.
파일 쓰기모드는 아래 기본구조를 보면서 배워보도록 하겠습니다.
with open("파일명.txt", "w") as 파일객체 :
파일객체.write("hello Python")
파일 열고 닫기에서 open(),close()문 보다는 with문을 활용하는게 좋다는 걸 배웠으니 이제 with문을 활용하여 코드를 작성하겠습니다.
위 기본구조를 보면 "w"라는 기능이 나오게 되는데 이게 파일 쓰기 모드의 키워드 입니다.
파일 쓰기 모드는 파일을 열면 기존 내용이 모두 삭제되고, 새로운 내용만 기록되므로 내용을 작성할 때 중요한 내용이 있다면 백업을 해두는 것도 좋은 방법입니다. 아래 예제를 확인해 주시면 되겠습니다.
다시 한번, 기존 내용은 아예 삭제가 된다고 생각 하시면 되겠습니다.
해당 문제를 해결하기 위해서 "a"라는 모드에 대해 배워 보겠습니다.
"a"는 기존 파일 내용을 유지하면서, 새로운 데이터를 맨 끝에 덧붙이는 키워드입니다.
with open("test.txt", "a") as f:
f.write("\nNew Line") # 기존 내용 뒤에 줄바꿈 후 "New Line" 추가
예제를 보시 듯 이렇게 맨 마지막에 "되지 않고 유지 됩니다" 라는 문장이 자연스럽게 생성되는 걸 확인 하실 수 있으십니다.
그 다음은 파일이 없을 때 새로 생성하여 작성 할 수 있는 "x"라는 모드에 대해 알아 보겠습니다.
"x"는 신규 생성 모드로 파일이 없을 때만 새로 생성 가능합니다.
만약 파일이 존재 한다면, FileExistsError라는 오류코드를 접하게 됩니다.
기존 파일을 유지하고 새로운 파일을 만들고 싶을 때 사용하시면 되겠습니다.
이런 식으로 새파일을 생성하는 할 수 있습니다.
▶파일을 읽는 여러가지 방법
파일을 읽을 때는 한가지 방법만 있는게 아닙니다
read()함수로만 파일을 읽었지만 다른 함수들도 배워보도록 하겠습니다.
먼저, 가장 익숙한 read()대한 설명을 한번 더 하겠습니다.
파일 내용을 한 번에 전부 문자열로 읽어 올 수 있으며, 작은 파일 다룰 때 편리하지만, 큰 파일은 메모리 많이 차지할 수 있습니다.
다음은, readline() 이라는 함수 입니다.
파일에서 한 줄씩 읽어오며 while반복문과 함께 사용 합니다.
while문과 함께 사용시
단독으로 사용시
두 예제를 함께 보고 비교 하면서 이해해 봅시다.
with open("test1.txt", "r", encoding = "utf-8") as f: #"test1.txt" 파일의 객체명을 f로 지정하고 읽기모드만 하겠다
line = f.readline() # line이라는 f객체를 한줄 씩 읽어오라는 .readline()함수
while line: # while 반복조건 line 변수의 객체 반복
print(line, end="")# end="" : 줄바꿈 중복 방지, 조건이 만족할 때 까지 출력
line = f.readline()#라인 조건안의 값을 한줄 씩 출력
해당 조건에서 break문을 안쓰는 이유는 line이라는 변수로 조건을 제어하고 있기 때문에 빈문자열을 만나면 자동 종료가 됩니다.
다음은 readlines()라는 함수 입니다.
파일의 모든 줄을 읽어서 리스트(list) 형태로 반환하며 줄 단위로 처리할 때 유용합니다.
\n이 붙는이유
파일은 실제로 줄 끝에 개행 문자 \n을 포함해서 저장되어
readlines()는 이 줄바꿈까지 그대로 읽어오기 때문에 리스트 원소 끝에 \n이 붙는 것입니다.
해당 \n을 없애고 싶으면 strip() 함수를 사용하시면 되겠습니다.
다음은 파일 객체 순회 라고 부르는 for line in f: 라는 코드를 배우겠습니다.
간단히 말해 파일 객체를 for문과 함께 사용하는 방법입니다.
for 반복문을 통해 line이라는 임시 변수에 f 객체를 저장하여 값을 하나씩 반복 추출 합니다.
readline()+while 의 차이는 for line in f 부분은 실행 결과는 같고, 코드 스타일만 다르다는 점이 있습니다.
코드스타일이 다른건 readline()+while은 명시적 조건검사가 필요시, for line in f 더 간결한 파이썬 다운 방법이라 생각하시면 됩니다.
이로써 해당 파일 읽고 쓰기에 관한 내용을 마치겠습니다.
고생하셨습니다.😁
📘 참고:
《Do it! 점프 투 파이썬 (전면 개정 2판)》, 박응용 저, 이지스퍼블리싱, 2023
※ 본 글은 위 교재의 내용을 학습 및 정리 목적으로 요약/재구성한 글입니다.
'Python(파이썬)_점프 투 파이썬 > 파이썬의 입출력' 카테고리의 다른 글
sys모듈 사용하기 (1) | 2025.08.28 |
---|---|
파이썬 사용자 입출력 (3) | 2025.08.24 |
파이썬 함수 (0) | 2025.08.24 |