파이썬 입출력과 파일 처리 완벽 가이드

읽기 예상 시간: 8분

파이썬을 다루면서 가장 기본이 되는 콘솔 입출력 함수인 print()input()의 숨겨진 활용법부터, 입력받은 데이터를 제대로 써먹기 위한 형변환 규칙을 확실하게 잡아볼게요. 또한 데이터를 영구적으로 보관하기 위한 파일 입출력 과정에서 누구나 겪는 경로 문제, 그리고 with open()을 활용한 안전한 파일 처리 패턴을 설명해 드려요. 실무에서 떼려야 뗄 수 없는 CSV 파일을 다룰 때 단순 분리 방식이 왜 위험한지 파악하고, 내장 모듈로 안전하게 처리하는 팁까지 한 번에 알아가실 수 있어요.

목차

1. print() 심화: 출력 형식 세밀하게 조절하기

파이썬을 처음 배울 때 화면에 무언가를 띄우기 위해 가장 먼저 쓰는 함수가 print()죠. 단순히 괄호 안에 값을 넣으면 화면에 보여주는 기본적인 역할만 한다고 생각하기 쉬워요. 하지만 조금만 깊게 들어가면 print()에는 숨겨진 두 가지 강력한 무기가 있어요. 바로 sepend라는 인자예요.

sep(separator, 구분자)은 여러 개의 값을 한 번에 출력할 때 그 사이에 무엇을 끼워 넣을지 결정해요. 아무것도 설정하지 않으면 기본값은 공백(띄어쓰기)이에요. 반면에 end는 출력이 다 끝난 뒤 맨 마지막 꼬리에 무엇을 붙일지 결정해요. 기본값이 줄바꿈(\n)으로 설정되어 있기 때문에, 우리가 print()를 쓸 때마다 자연스럽게 다음 줄로 넘어가는 거예요. 이 두 가지를 적절히 조작하면 텍스트 출력을 내 마음대로 자유롭게 제어할 수 있어요.

아래 코드는 날짜 사이에 띄어쓰기 대신 하이픈을 넣고, 로딩 바를 여러 줄이 아닌 한 줄에 깔끔하게 이어서 출력하는 방법을 보여줘요. 한 번 따라 해보세요.

python
print_advanced.py
# sep을 이용해 값들 사이에 공백 대신 하이픈(-)을 넣습니다.
print("2026", "03", "21", sep="-") 

# end를 이용해 줄바꿈을 없애고, 글자를 한 줄에 계속 이어 붙입니다.
print("로딩 중", end="")
print(".", end="")
print(".", end="")
print(".")

이 코드를 실행하면 날짜는 2026-03-21 형태로 예쁘게 출력되고, 로딩 표시는 지저분하게 줄을 바꾸지 않고 로딩 중...으로 한 줄에 깔끔하게 나오는 걸 볼 수 있어요. 아주 간단하지만 실무에서 로그를 남기거나 진행 상황을 콘솔에 찍어볼 때 정말 자주 쓰는 기법이랍니다.

📌 Note

sep과 end 인자는 반드시 print() 함수의 맨 마지막 부분에 적어주어야 문법 에러가 발생하지 않아요. 위치를 헷갈리지 마세요.

블록을 일렬로 깔끔하게 맞추며 출력 형식을 제어하는 모습

2. input(): 사용자 입력 받고 숫자로 변환하기

혼자 도는 프로그램이 아니라, 사용자에게 질문을 던지고 답변을 받아 작동하는 인터랙티브한 프로그램을 만들고 싶다면 input() 함수를 써야 해요. 괄호 안에 질문할 안내 문구를 적어두면, 사용자가 키보드로 값을 치고 엔터(Enter)를 누를 때까지 파이썬 프로그램이 얌전히 기다려줘요.

여기서 초보자들이 가장 많이 당황하는 핵심이 하나 있어요. input()으로 들어온 데이터는 무조건 문자열(str) 취급을 받는다는 거예요. 사용자가 10이라는 숫자를 입력해도, 파이썬은 이를 계산할 수 있는 숫자 10이 아니라 글자 “10”으로 인식해요. 글자끼리는 수학적인 덧셈이나 곱셈을 할 수 없잖아요? 그래서 숫자를 계산에 쓰려면 정수는 int(), 실수는 float()를 사용해서 데이터의 성격을 바꿔주어야 해요. 우리는 이것을 형변환이라고 불러요.

python
user_input.py
# 사용자에게 입력을 받아 name 변수에 문자열로 저장합니다.
name = input("이름을 입력하세요: ")

# 사용자에게 나이를 입력받습니다. 반환값은 문자열입니다.
age_str = input("나이를 입력하세요: ")

# 문자열을 수학 계산이 가능한 정수(int) 형태로 변환합니다.
age = int(age_str)

# 변환된 정수에 1을 더해 결과를 출력합니다.
print(name, "님, 내년에는", age + 1, "살이 되시네요!")

코드를 보면 나이를 age_str로 먼저 받은 뒤, int()로 감싸서 실제 숫자로 만들어주는 과정이 있죠? 이 과정을 생략하고 바로 age_str + 1을 해버리면, 글자와 숫자를 더할 수 없다는 에러가 나면서 프로그램이 강제 종료돼요. 입력을 받을 때는 항상 “내가 이 데이터를 계산에 쓸 것인가?”를 먼저 고민해 보세요.

⚠️ Warning

만약 사용자가 나이를 묻는 칸에 숫자 대신 “스무살” 같은 문자를 입력하면, 정수로 변환할 수 없어서 ValueError가 발생해요. 실무에서는 try-except 구문을 써서 이런 예외 상황을 방어하는 코드를 반드시 짜야 해요.

문서를 새로운 형태의 데이터로 변환하는 미래형 기계

3. 파일 입출력의 첫걸음: 파일은 어디에 저장될까?

콘솔창에 임시로 글자를 띄우는 걸 넘어서, 이제 우리가 수집하거나 가공한 데이터를 메모장 같은 파일로 저장해 두고 싶을 거예요. 이때 파이썬 파일 작업을 시도하다가 초보자들이 가장 많이 겪는 에러가 바로 FileNotFoundError예요. “나는 분명히 파일명을 똑바로 적었는데, 파이썬이 파일을 못 찾겠대요!”라는 질문을 커뮤니티에서 하루에도 수십 번씩 볼 수 있어요.

이 문제의 원인은 거의 100% ‘경로’를 제대로 이해하지 못했기 때문이에요. 코드에 단순히 "data.txt"처럼 파일 이름만 달랑 적어두면, 파이썬은 내 컴퓨터 전체를 뒤지는 게 아니라 ‘현재 파이썬이 실행되고 있는 폴더’에서만 파일을 찾으려 해요. 이것을 상대 경로라고 불러요. 에디터 설정에 따라 이 기준 폴더가 엉뚱한 곳으로 잡혀 있는 경우가 많죠.

반대로 C:\Users\홍길동\Documents\data.txt처럼 드라이브부터 시작하는 전체 주소를 꼼꼼하게 적는 것을 절대 경로라고 해요. 파이썬 파일 입출력 작업을 할 때 파일이 자꾸 엉뚱한 곳에 저장되거나 못 찾는다면, 일단 절대 경로를 명시해 보는 것이 가장 빠르고 안전한 해결책이에요.

python
path_example.py
# 1. 상대 경로: 현재 파이썬을 실행한 폴더에 파일이 생기거나, 거기서 찾습니다.
file_name = "simple.txt"

# 2. 절대 경로: 드라이브부터 시작하는 정확한 주소를 지정합니다.
# 경로를 쓸 때 역슬래시(\)로 인한 오류를 막기 위해 문자열 앞에 r을 붙이는 것이 안전합니다.
absolute_path = r"C:\Temp\important_data.txt"

# 주의: 위 경로들은 경로 개념을 설명하기 위한 변수입니다. 
# 실제로 파일을 열려면 다음 섹션에서 배울 open() 함수에 이 변수들을 넣어야 합니다.

윈도우 운영체제에서는 폴더 경로를 나눌 때 역슬래시(\)를 써요. 그런데 파이썬 문자열에서 역슬래시는 \n(줄바꿈), \t(탭)처럼 특별한 기능을 하는 특수 기호로 취급돼요. 그래서 경로를 적을 때 의도치 않은 오류가 자주 나거든요. 이럴 때는 항상 따옴표 앞에 소문자 r을 붙여서 “이 안에 있는 역슬래시는 특수 기호가 아니라 그냥 글자야!”라고 파이썬에게 알려주는 습관을 들이세요.

수많은 서류함 속에서 정확한 위치의 폴더를 찾는 돋보기

4. 안전한 파일 처리: open()과 with 문

경로의 개념을 확실히 잡았으니, 이제 진짜로 파일을 열어볼 차례예요. 파이썬에서 파일을 열 때는 open() 함수를 사용해요. 그런데 명심해야 할 점이 있어요. 파일을 열었으면 작업이 다 끝난 뒤에 반드시 close() 함수를 호출해서 닫아주어야 한다는 거예요. 냉장고 문을 열고 내용물을 꺼낸 뒤에 문을 안 닫으면 냉기가 다 빠져나가고 고장 나는 것과 완벽하게 같은 이치예요. 파일 문을 열어두면 컴퓨터 메모리를 계속 갉아먹고, 나중에는 파일을 수정할 수 없는 잠금 상태에 빠지게 돼요.

하지만 사람인지라 코딩을 하다 보면 파일을 닫는 close() 코드를 까먹기 일쑤죠. 더 큰 문제는, 중간에 치명적인 에러가 나서 프로그램이 close() 줄에 도달하기도 전에 뻗어버리는 상황이에요. 이런 불상사를 원천적으로 차단하기 위해 파이썬에서는 with 문이라는 훌륭한 문법을 제공해요. with 블록 안에서 파일 작업을 하고 들여쓰기 블록을 빠져나오는 순간, 파이썬이 알아서 문을 쾅 닫아주는 아주 안전한 방식이에요.

python
write_file.py
# 'w' 모드로 test.txt 파일을 엽니다. 파일이 없으면 새로 만듭니다.
# 한글이 깨지지 않도록 encoding="utf-8"을 반드시 적어줍니다.
with open("test.txt", "w", encoding="utf-8") as f:
    
    # 열린 파일 객체 f를 사용해 텍스트를 기록합니다.
    f.write("안녕하세요.\n")
    f.write("파이썬 파일 쓰기 테스트입니다.\n")
    
# 들여쓰기(블록)가 끝나는 이 지점에서 파일은 자동으로 닫힙니다.

파일을 열 때는 목적에 맞는 ‘모드’를 정확히 골라야 해요. 읽기만 할 때는 'r'(read), 새로운 내용을 쓸 때는 'w'(write), 기존 파일의 맨 끝에 내용을 추가로 덧붙일 때는 'a'(append)를 쓴다는 걸 꼭 기억해 두세요.

❗ 중요

‘w’ 모드는 아주 무서운 녀석이에요. 파일이 이미 존재한다면, 아무런 경고도 없이 기존 내용을 싹 다 지워버리고 백지상태에서 다시 쓰기 시작하거든요. 기존 데이터를 조금이라도 보존해야 한다면 무조건 ‘a’ 모드를 써야 합니다. 한순간의 실수로 데이터를 날리지 않게 조심하세요.

작업 후 자동으로 안전하게 닫히는 미래형 금고 문

5. 파일 쓰기와 읽기 실전

파일을 열고 닫는 법을 익혔으니, 이제 그 안의 텍스트를 자유자재로 다루는 구체적인 방법들을 살펴볼게요. 앞서 코드로 본 write()는 문자열 딱 하나를 파일에 밀어 넣을 때 써요. 만약 리스트 자료형 안에 수백 줄의 문장이 쪼개져서 들어있고 이걸 한 번에 쓰고 싶다면, writelines()라는 전용 함수를 사용하면 코드가 훨씬 깔끔해져요.

이제 쓴 파일을 읽어올 차례죠. 파일 내용을 읽는 방법은 크게 두 가지로 나뉘어요. 첫 번째는 read() 함수를 써서 파일 전체 내용을 하나의 거대한 문자열로 통째로 가져오는 방식이에요. 작은 텍스트 파일이라면 문제가 없지만, 파일 크기가 기가바이트 단위로 아주 크다면 컴퓨터 메모리가 꽉 차서 프로그램이 죽어버릴 수 있어요. 그래서 가장 권장하는 두 번째 방식은 for문을 사용해 파일에서 한 줄씩 순서대로 꺼내오는 거예요. 이 방법은 메모리 낭비가 전혀 없어서 아주 효율적이랍니다.

아래 예제 코드로 안전하게 한 줄씩 읽어오는 표준 패턴을 확인해 보세요.

python
read_file.py
# 먼저 연습용 파일을 'w' 모드로 생성합니다.
with open("diary.txt", "w", encoding="utf-8") as f:
    f.write("첫 번째 줄입니다.\n")
    f.write("두 번째 줄입니다.\n")

# 생성한 파일을 'r' 모드(읽기)로 다시 엽니다.
with open("diary.txt", "r", encoding="utf-8") as f:
    
    # for문을 사용해 파일에서 한 줄씩(line) 꺼내옵니다.
    for line in f:
        # 파일에 적힌 줄바꿈(\n)과 print()의 기본 줄바꿈이 겹치지 않게
        # rstrip()을 사용해 오른쪽 끝의 줄바꿈 문자를 제거하고 출력합니다.
        print(line.rstrip())

코드를 자세히 보면 rstrip()이라는 함수가 보일 거예요. 파일에 글을 쓸 때 줄을 바꾸려고 우리가 직접 \n을 입력했죠? 읽어올 때도 이 엔터 기호가 고스란히 딸려옵니다. 이걸 그대로 print()에 넣으면 print() 자체의 줄바꿈과 합쳐져서 두 줄씩 붕붕 뜨게 돼요. 그래서 출력하기 직전에 오른쪽 꼬리에 달린 불필요한 공백과 줄바꿈을 싹둑 잘라내는 rstrip() 과정이 꼭 필요해요. 이거 정말 많이 하는 실수니까 잊지 마세요.

문서의 텍스트를 한 줄씩 정확하게 읽어내는 레이저 스캐너

6. CSV 다루기: split의 한계와 csv 모듈의 등장

회사에서, 혹은 데이터 분석을 할 때 우리가 가장 많이 마주치는 파일 형식이 바로 CSV 파일이에요. 엑셀로도 자주 열람하는 이 파일은 사실 복잡한 구조가 아니라 단순히 데이터를 쉼표(,)로 구분지어 놓은 텍스트 파일일 뿐이에요. 얼핏 생각하면 텍스트 파일 읽듯이 한 줄씩 읽어와서 파이썬의 기본 기능인 split(",")으로 쉼표마다 싹둑싹둑 자르면 될 것 같죠? 저도 처음엔 그렇게 코딩을 했었어요.

하지만 단순하게 문자열을 쪼개는 방식을 실무에 쓰다 보면 언젠가 거대한 재앙을 맞이하게 돼요. 진짜 데이터 자체에 쉼표가 들어있는 경우가 무조건 생기거든요. 예를 들어 주소 데이터가 "서울, 강남구" 형태로 저장되어 있다고 해볼게요. 이름, 나이, 주소 3개로 깔끔하게 쪼개져야 할 데이터가 주소 중간에 낀 쉼표 때문에 4개로 쪼개져 버려요. 데이터의 열(Column) 개수가 뒤죽박죽 엉키면서 전체 파이프라인이 망가지는 거죠. 이 골치 아픈 문제를 완벽하게 덮어주는 방패가 바로 파이썬에 기본으로 탑재된 csv 모듈이에요.

CSV 모듈을 올바르게 사용하는 방법을 단계별로 쪼개서 살펴볼게요.

1
csv 모듈 불러오기 및 데이터 준비

추가 설치 없이 import csv만 상단에 적어주면 준비가 끝나요. 테스트용으로 쉼표가 포함된 함정 데이터를 준비합니다.

2
csv.writer로 안전하게 쓰기

파일을 쓸 때는 writer 객체를 만들어서 사용해요. 리스트를 던져주면 알아서 CSV 형식에 맞게, 필요하면 따옴표로 감싸서 기록해 줍니다.

3
csv.reader로 똑똑하게 읽기

가장 중요한 부분이에요. reader 객체를 통해 읽어오면, 데이터 내부에 포함된 쉼표에 속지 않고 정확한 구조로 데이터를 파싱해 냅니다.

python
handle_csv.py
# 파이썬에 기본으로 설치된 csv 모듈을 불러옵니다.
import csv

# 문제가 될 수 있는 쉼표가 포함된 데이터를 준비합니다.
data = [
    ["홍길동", 28, "서울, 강남구"], # 데이터 내부에 쉼표가 있음
    ["김파이썬", 35, "부산, 해운대구"]
]

# 1. csv.writer를 사용해 데이터를 파일에 안전하게 씁니다.
with open("users.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.writer(f)
    writer.writerow(["이름", "나이", "주소"]) # 헤더 작성
    for row in data:
        writer.writerow(row) # 리스트 한 줄씩 작성

# 2. csv.reader를 사용해 파일을 읽어옵니다.
with open("users.csv", "r", encoding="utf-8") as f:
    reader = csv.reader(f)
    for row in reader:
        # csv 모듈이 주소 안의 쉼표를 알아서 판단하여 안전하게 리스트로 만들어줍니다.
        print(row)

csv 모듈은 내부 데이터에 포함된 쉼표를 구분자가 아닌 일반 문자로 영리하게 처리해 줘요. 앞으로 CSV 파일을 다뤄야 할 일이 생기면, 귀찮다고 split(",") 쓰지 마시고 무조건 이 모듈을 쓰는 습관을 들이세요. 나중에 큰 오류를 막아주는 든든한 보험이 될 거예요.

💡 Tip

csv 파일을 open() 할 때는 윈도우 환경에서 빈 줄이 한 줄씩 불필요하게 추가되는 현상을 막기 위해, 반드시 newline=”” 인자를 추가로 넣어주세요. 아주 꿀팁이에요.

복잡하게 섞인 구슬들을 규칙에 따라 깔끔하게 병에 분류하는 로봇 팔
손상과 오류로부터 중요한 문서를 안전하게 보호하는 방패

7. 초보자가 가장 자주 하는 실수 총정리

파일과 입출력을 처음 배우고 코딩을 시작하면, 진짜 누구나 한 번쯤은 꼭 겪게 되는 공통적인 실수들이 있어요. 답답해서 모니터를 부수고 싶기 전에 아래 세 가지 체크리스트만 기억해 두시면, 디버깅하느라 밤새는 시간을 획기적으로 줄이실 수 있어요.

  • 한글 깨짐 현상 방치: 윈도우와 맥은 기본적으로 글자를 저장하는 방식(인코딩)이 완전히 달라요. open() 함수를 쓸 때 귀찮다고 encoding="utf-8"을 빼먹으면, 내 컴퓨터에선 잘 보이던 글씨가 다른 사람 컴퓨터에서는 정체불명의 외계어로 깨져 나올 확률이 아주 높아요. 파일을 열 때는 호흡하듯이 무조건 적어주세요.
  • 중요한 원본 파일 날려 먹기: 이미 데이터가 잔뜩 쌓여 있는 아주 소중한 파일을 다룰 때, 아무 생각 없이 'w' 모드를 사용해서 여는 순간! 파일 용량이 0바이트로 초기화돼버려요. 눈물이 날 수도 있어요. 기존 내용을 철저히 보존하면서 내용만 밑에 슬쩍 이어붙이려면 반드시 'a' 모드를 사용하셔야 해요.
  • 출력할 때 듬성듬성 빈 줄이 생기는 현상: readlines()for문으로 파일을 한 줄씩 읽어오게 되면, 문장 끝에 우리 눈에 보이지 않는 엔터 기호(\n)가 찰싹 달라붙어 있어요. 이걸 그대로 print() 안에 집어넣으면, 출력이 한 줄씩 듬성듬성 건너뛰며 지저분하게 나와요. 출력하기 전에는 항상 rstrip()을 사용해서 이 불필요한 꼬리표를 떼어주세요.

자주 묻는 질문

Q. 분명 코드를 실행했는데 FileNotFoundError가 뜹니다. 파일이 도대체 어디에 생성된 건가요?

경로를 명확하게 명시하지 않고 "data.txt"처럼 파일명만 덜렁 적으셨다면, 현재 파이썬 스크립트가 실행되고 있는 ‘현재 작업 디렉토리’를 기준으로 파일을 찾거나 생성하게 됩니다. VS Code 같은 에디터 환경에서는 내가 열어둔 워크스페이스 최상단 폴더가 기준이 되는 경우가 아주 많아요. 확실하게 하려면 파일의 전체 절대 경로를 입력해보시거나, os.getcwd()를 출력해서 현재 파이썬이 어디를 바라보고 있는지 위치를 먼저 확인해 보시는 게 좋습니다.

Q. CSV 파일을 split(‘,’)으로 나누고 있는데, 주소 데이터(예: ‘서울, 강남구’)에 있는 쉼표 때문에 데이터 열이 잘못 쪼개집니다. 어떻게 해결해야 하나요?

이게 바로 단순한 문자열 분리(split) 방식이 갖는 가장 대표적인 치명적 한계점이에요. 데이터 내부의 쉼표와 구분자 쉼표를 코드만으로는 구분할 수 없거든요. 이럴 때는 파이썬에 기본 내장된 csv 모듈을 사용하셔야 해요. csv.reader를 거치면 데이터 내부의 쉼표는 구분 기준으로 삼지 않고 아주 안전하게 리스트로 파싱해 주니까, 더 이상 스트레스 받지 마세요.

Q. 실수로 ‘w’ 모드를 써서 중요한 파일을 열어버렸습니다. 삭제된 내용을 코드로 다시 복구할 방법이 있을까요?

정말 안타깝지만 복구할 수 없어요. ‘w’ 모드로 파일을 여는 그 즉시 운영체제 단에서 기존 내용은 삭제(Truncate) 처리가 되기 때문에 파이썬 코드 자체만으로는 절대 되돌릴 수 없습니다. 파일 내용을 유지하면서 데이터를 추가하고 싶다면 항상 ‘a'(Append) 모드를 쓰셔야 하고, 중요한 파일을 코드로 다룰 때는 무조건 사본 백업을 만들어두는 습관을 들이시는 게 최선입니다.

이 글이 마음에 드세요?

RSS 피드를 구독하세요!

댓글 남기기