🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

파일 입출력과 데이터 포맷 완벽 가이드 - 슬라이드 1/7
A

AI Generated

2025. 12. 1. · 14 Views

파일 입출력과 데이터 포맷 완벽 가이드

파이썬에서 다양한 형식의 파일을 읽고 쓰는 방법을 배웁니다. 텍스트, CSV, JSON부터 객체 직렬화까지 실무에서 바로 활용할 수 있는 파일 처리 기법을 익혀봅시다.


목차

  1. 텍스트_파일_읽기_쓰기
  2. CSV_파일_처리
  3. JSON_파일_처리
  4. Pickle로_객체_저장
  5. with문과_컨텍스트_매니저
  6. 경로_처리_pathlib

1. 텍스트 파일 읽기 쓰기

김개발 씨는 오늘 처음으로 로그 분석 업무를 맡게 되었습니다. 수천 줄에 달하는 로그 파일을 열어봐야 하는데, 어디서부터 시작해야 할지 막막했습니다.

선배 박시니어 씨가 다가와 말했습니다. "파일 입출력의 기본부터 알아야지.

모든 데이터 처리의 시작점이거든."

텍스트 파일 입출력은 프로그램이 외부 파일과 데이터를 주고받는 가장 기본적인 방법입니다. 마치 편지를 쓰고 읽는 것처럼, 프로그램도 파일에 내용을 기록하고 읽어올 수 있습니다.

이것을 제대로 이해하면 로그 분석, 설정 파일 관리, 데이터 백업 등 다양한 실무 작업을 수행할 수 있습니다.

다음 코드를 살펴봅시다.

# 파일 쓰기 - 새로운 파일을 생성하고 내용을 기록합니다
file = open("greeting.txt", "w", encoding="utf-8")
file.write("안녕하세요!\n")
file.write("파이썬 파일 입출력을 배우고 있습니다.\n")
file.close()

# 파일 읽기 - 저장된 내용을 불러옵니다
file = open("greeting.txt", "r", encoding="utf-8")
content = file.read()
print(content)
file.close()

# 한 줄씩 읽기 - 대용량 파일 처리에 유용합니다
file = open("greeting.txt", "r", encoding="utf-8")
for line in file:
    print(line.strip())
file.close()

김개발 씨는 입사 3개월 차 주니어 개발자입니다. 오늘 팀장님이 서버 로그 파일을 분석해서 오류 패턴을 찾아달라는 업무를 주셨습니다.

로그 파일이 수십 메가바이트에 달하는데, 이걸 어떻게 처리해야 할지 고민이 깊어졌습니다. 선배 개발자 박시니어 씨가 김개발 씨의 모니터를 보며 말했습니다.

"파일 입출력은 모든 프로그래밍의 기본이야. 이것만 제대로 알면 어떤 데이터든 다룰 수 있어." 그렇다면 파일 입출력이란 정확히 무엇일까요?

쉽게 비유하자면, 파일 입출력은 마치 책을 읽고 쓰는 행위와 같습니다. 우리가 노트에 메모를 적어두면 나중에 다시 꺼내 볼 수 있듯이, 프로그램도 파일에 데이터를 저장하고 필요할 때 다시 읽어올 수 있습니다.

프로그램이 종료되어도 파일에 저장된 데이터는 사라지지 않습니다. 파일을 다루려면 먼저 open() 함수로 파일을 열어야 합니다.

이때 두 번째 인자로 모드를 지정하는데, "r"은 읽기, "w"는 쓰기, "a"는 추가 모드를 의미합니다. 마치 도서관에서 책을 빌릴 때 열람용인지 대출용인지 목적을 밝히는 것과 같습니다.

"w" 모드로 파일을 열면 기존 내용이 모두 지워지고 새로 작성됩니다. 반면 "a" 모드는 기존 내용 뒤에 새 내용을 덧붙입니다.

로그 파일처럼 계속 기록을 쌓아가야 하는 경우에는 "a" 모드가 적합합니다. 위 코드를 살펴보면, 먼저 write() 메서드로 파일에 텍스트를 기록합니다.

줄바꿈을 하려면 "\n"을 명시적으로 넣어야 합니다. 그다음 read() 메서드는 파일의 전체 내용을 하나의 문자열로 반환합니다.

대용량 파일을 처리할 때는 한 줄씩 읽는 방식이 효율적입니다. for 반복문으로 파일 객체를 순회하면 메모리를 아끼면서 한 줄씩 처리할 수 있습니다.

수 기가바이트에 달하는 로그 파일도 이 방식으로 문제없이 처리할 수 있습니다. encoding 매개변수는 한글 처리에 필수입니다.

"utf-8"을 지정하지 않으면 한글이 깨지거나 오류가 발생할 수 있습니다. 실무에서는 항상 인코딩을 명시하는 습관을 들이는 것이 좋습니다.

파일 작업이 끝나면 반드시 close() 메서드를 호출해야 합니다. 파일을 닫지 않으면 데이터가 제대로 저장되지 않거나 다른 프로그램이 해당 파일에 접근하지 못하는 문제가 생길 수 있습니다.

박시니어 씨가 덧붙였습니다. "하지만 close()를 매번 호출하는 건 실수하기 쉬워.

나중에 with 문을 배우면 이 문제를 깔끔하게 해결할 수 있어." 김개발 씨는 고개를 끄덕였습니다. 파일 입출력의 기본을 이해하니, 로그 분석이 그리 어렵게 느껴지지 않았습니다.

실전 팁

💡 - 한글 파일을 다룰 때는 반드시 encoding="utf-8"을 지정하세요

  • "w" 모드는 기존 파일을 덮어쓰므로 주의가 필요합니다
  • 대용량 파일은 read() 대신 for 반복문으로 한 줄씩 처리하세요

2. CSV 파일 처리

김개발 씨에게 새로운 업무가 주어졌습니다. 마케팅팀에서 엑셀로 정리한 고객 데이터를 분석해달라는 요청이었습니다.

파일을 열어보니 CSV 형식이었습니다. "CSV가 뭐죠?" 김개발 씨가 물었고, 박시니어 씨가 웃으며 설명을 시작했습니다.

CSV(Comma-Separated Values)는 쉼표로 값을 구분하는 텍스트 파일 형식입니다. 엑셀 데이터를 프로그램에서 처리할 때 가장 널리 사용되는 포맷입니다.

파이썬의 csv 모듈을 사용하면 CSV 파일을 손쉽게 읽고 쓸 수 있습니다.

다음 코드를 살펴봅시다.

import csv

# CSV 파일 쓰기
with open("users.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.writer(file)
    writer.writerow(["이름", "나이", "도시"])
    writer.writerow(["김철수", 28, "서울"])
    writer.writerow(["이영희", 32, "부산"])

# CSV 파일 읽기
with open("users.csv", "r", encoding="utf-8") as file:
    reader = csv.reader(file)
    for row in reader:
        print(f"이름: {row[0]}, 나이: {row[1]}, 도시: {row[2]}")

# 딕셔너리 형태로 읽기 - 컬럼명으로 접근 가능
with open("users.csv", "r", encoding="utf-8") as file:
    reader = csv.DictReader(file)
    for row in reader:
        print(f"{row['이름']}님은 {row['도시']}에 살고 있습니다.")

김개발 씨가 받은 파일을 메모장으로 열어보니 이상한 형태였습니다. "이름,나이,도시"처럼 쉼표로 구분된 텍스트가 줄줄이 나열되어 있었습니다.

박시니어 씨가 설명했습니다. "CSV는 표 형태의 데이터를 저장하는 가장 간단한 방법이야." CSV가 왜 이렇게 널리 쓰이는 걸까요?

엑셀, 구글 스프레드시트, 데이터베이스 등 거의 모든 프로그램이 CSV를 지원합니다. 형식이 단순해서 사람이 직접 읽을 수도 있고, 프로그램으로 처리하기도 쉽습니다.

마치 모든 나라에서 통용되는 세계 공용어 같은 존재입니다. 파이썬에서 CSV를 다루려면 csv 모듈을 import합니다.

직접 쉼표로 분리해서 처리할 수도 있지만, csv 모듈을 사용하면 값 안에 쉼표가 포함된 경우도 자동으로 처리해줍니다. csv.writer는 CSV 파일에 데이터를 기록하는 객체입니다.

writerow() 메서드에 리스트를 전달하면 한 줄을 기록합니다. 첫 번째 줄에는 보통 컬럼명(헤더)을 적습니다.

파일을 쓸 때 newline="" 옵션이 중요합니다. 이 옵션이 없으면 윈도우에서 줄바꿈이 두 번씩 들어가는 문제가 생깁니다.

csv 모듈이 내부적으로 줄바꿈을 처리하기 때문에, 추가 줄바꿈을 방지하려면 빈 문자열을 지정해야 합니다. csv.reader로 파일을 읽으면 각 줄이 리스트로 변환됩니다.

for 반복문으로 순회하면서 인덱스로 값에 접근할 수 있습니다. row[0]은 첫 번째 컬럼, row[1]은 두 번째 컬럼 값입니다.

하지만 인덱스로 접근하면 코드를 읽기 어렵습니다. "row[2]가 뭐였더라?" 하고 매번 확인해야 하니까요.

이럴 때 DictReader가 유용합니다. DictReader는 첫 번째 줄을 헤더로 인식하고, 각 줄을 딕셔너리로 변환합니다.

row['이름']처럼 컬럼명으로 값에 접근할 수 있어 코드가 훨씬 읽기 쉬워집니다. 마찬가지로 DictWriter를 사용하면 딕셔너리를 CSV로 기록할 수 있습니다.

데이터베이스에서 가져온 데이터를 CSV로 내보낼 때 특히 편리합니다. 김개발 씨는 csv 모듈로 고객 데이터를 읽어 들이고, 서울에 사는 고객만 필터링하는 스크립트를 뚝딱 만들었습니다.

마케팅팀에서 감사 인사가 쏟아졌습니다.

실전 팁

💡 - newline="" 옵션을 빼먹으면 윈도우에서 빈 줄이 추가로 생깁니다

  • 컬럼이 많을 때는 DictReader를 사용하면 코드 가독성이 좋아집니다
  • 엑셀에서 CSV로 저장할 때 인코딩을 UTF-8로 지정하세요

3. JSON 파일 처리

API 개발을 시작한 김개발 씨는 낯선 형식의 데이터를 마주했습니다. 중괄호와 대괄호가 뒤섞인 이상한 텍스트였습니다.

"이건 JSON이야. 요즘 웹 개발에서 가장 많이 쓰이는 데이터 포맷이지." 박시니어 씨의 설명에 김개발 씨의 눈이 반짝였습니다.

JSON(JavaScript Object Notation)은 데이터를 키-값 쌍으로 표현하는 텍스트 형식입니다. 파이썬 딕셔너리와 거의 동일한 구조를 가지고 있어 파이썬에서 다루기 매우 편리합니다.

웹 API의 표준 데이터 포맷으로, 서버와 클라이언트 간 데이터 교환에 널리 사용됩니다.

다음 코드를 살펴봅시다.

import json

# 파이썬 데이터를 JSON 파일로 저장
user_data = {
    "name": "김개발",
    "age": 27,
    "skills": ["Python", "JavaScript", "SQL"],
    "is_employed": True
}

with open("user.json", "w", encoding="utf-8") as file:
    json.dump(user_data, file, ensure_ascii=False, indent=2)

# JSON 파일을 파이썬 데이터로 읽기
with open("user.json", "r", encoding="utf-8") as file:
    loaded_data = json.load(file)
    print(f"{loaded_data['name']}님의 기술: {loaded_data['skills']}")

# 문자열로 변환 (API 응답 등에 활용)
json_string = json.dumps(user_data, ensure_ascii=False)
print(json_string)

김개발 씨가 처음 본 JSON 데이터는 이런 형태였습니다. {"name": "홍길동", "age": 30}.

중괄호 안에 키와 값이 콜론으로 연결되어 있고, 여러 항목은 쉼표로 구분됩니다. 어디서 많이 본 것 같지 않나요?

맞습니다. 파이썬의 딕셔너리와 거의 똑같은 구조입니다.

사실 JSON은 자바스크립트에서 유래했지만, 그 단순함 덕분에 모든 프로그래밍 언어에서 사용됩니다. 파이썬에서는 딕셔너리와 JSON을 자유롭게 변환할 수 있습니다.

파이썬의 json 모듈은 네 가지 핵심 함수를 제공합니다. **dump()**는 파일에 저장하고, **load()**는 파일에서 읽습니다.

**dumps()**는 문자열로 변환하고, **loads()**는 문자열을 파싱합니다. s가 붙은 함수는 string을 다룬다고 기억하면 됩니다.

ensure_ascii=False 옵션은 한글 처리에 필수입니다. 이 옵션이 없으면 한글이 "\uAC00\uB098\uB2E4" 같은 유니코드 이스케이프 시퀀스로 저장됩니다.

사람이 읽을 수 없는 형태가 되어버리는 것이죠. indent 옵션은 들여쓰기를 추가해 JSON을 보기 좋게 정렬합니다.

개발 중에는 indent=2나 indent=4를 사용하면 디버깅이 편해집니다. 다만 배포 환경에서는 용량을 줄이기 위해 들여쓰기 없이 저장하기도 합니다.

JSON에서 주의할 점이 있습니다. 파이썬의 True와 False는 JSON에서 true와 false(소문자)로 변환됩니다.

None은 null이 됩니다. json 모듈이 자동으로 변환해주므로 걱정할 필요는 없지만, JSON 파일을 직접 편집할 때는 알아두어야 합니다.

또한 JSON은 튜플을 지원하지 않습니다. 파이썬 튜플은 JSON으로 저장할 때 리스트로 변환됩니다.

다시 읽어오면 리스트가 되므로, 튜플이 필요한 경우 직접 변환해야 합니다. 실무에서 JSON은 정말 많이 사용됩니다.

설정 파일, API 응답, 데이터 저장 등 어디서나 만날 수 있습니다. 웹 개발을 한다면 JSON과 친해지는 것은 필수입니다.

김개발 씨는 JSON으로 사용자 설정을 저장하는 기능을 구현했습니다. 프로그램을 껐다 켜도 설정이 유지되니 사용자들이 만족해했습니다.

실전 팁

💡 - ensure_ascii=False를 빼먹으면 한글이 이상한 코드로 저장됩니다

  • 개발 중에는 indent 옵션으로 가독성을 높이세요
  • API 응답 처리 시에는 dumps()와 loads()를 사용합니다

4. Pickle로 객체 저장

김개발 씨는 머신러닝 모델을 학습시키고 나서 고민에 빠졌습니다. 학습에 몇 시간이 걸렸는데, 프로그램을 껐다 켜면 처음부터 다시 해야 할까요?

박시니어 씨가 해결책을 알려줬습니다. "Pickle을 쓰면 파이썬 객체를 그대로 저장할 수 있어."

Pickle은 파이썬 객체를 바이너리 형태로 직렬화하여 파일에 저장하는 모듈입니다. 리스트, 딕셔너리는 물론 클래스 인스턴스, 함수 등 거의 모든 파이썬 객체를 저장하고 복원할 수 있습니다.

마치 냉동 보관처럼 객체의 현재 상태를 그대로 얼려두었다가 나중에 해동할 수 있습니다.

다음 코드를 살펴봅시다.

import pickle

# 복잡한 데이터 구조 저장
data = {
    "users": [{"name": "김철수", "scores": [85, 90, 78]}],
    "settings": {"theme": "dark", "language": "ko"},
    "count": 42
}

# 객체를 파일로 저장 (직렬화)
with open("data.pkl", "wb") as file:
    pickle.dump(data, file)

# 파일에서 객체 복원 (역직렬화)
with open("data.pkl", "rb") as file:
    loaded_data = pickle.load(file)
    print(loaded_data["settings"]["theme"])  # dark

# 클래스 인스턴스도 저장 가능
class User:
    def __init__(self, name):
        self.name = name

user = User("이영희")
with open("user.pkl", "wb") as file:
    pickle.dump(user, file)

머신러닝 모델을 학습시키는 데 3시간이 걸렸습니다. 김개발 씨는 학습된 모델을 어떻게 저장할지 고민했습니다.

JSON으로 저장하자니 복잡한 객체 구조를 표현하기 어려웠습니다. 바로 이럴 때 Pickle이 빛을 발합니다.

Pickle이라는 이름은 음식을 절여서 오래 보관하는 것에서 유래했습니다. 오이를 피클로 만들면 오랫동안 보관할 수 있듯이, 파이썬 객체도 Pickle로 저장하면 나중에 그대로 복원할 수 있습니다.

JSON과 Pickle의 가장 큰 차이점은 무엇일까요? JSON은 텍스트 형식이라 사람이 읽을 수 있지만, 기본 자료형만 저장할 수 있습니다.

반면 Pickle은 바이너리 형식이라 사람이 읽을 수 없지만, 파이썬의 거의 모든 객체를 저장할 수 있습니다. Pickle을 사용할 때는 파일 모드에 주의해야 합니다.

바이너리 데이터를 다루므로 쓰기 모드는 "wb", 읽기 모드는 **"rb"**를 사용합니다. b가 없으면 오류가 발생합니다.

dump() 함수로 객체를 저장하고, load() 함수로 복원합니다. 복원된 객체는 원래 객체와 완전히 동일한 상태를 가집니다.

마치 타임머신을 타고 과거로 돌아간 것처럼요. 클래스 인스턴스를 Pickle로 저장할 때 주의할 점이 있습니다.

객체를 불러올 때 해당 클래스가 정의되어 있어야 합니다. 클래스 정의가 없으면 복원에 실패합니다.

따라서 Pickle 파일을 다른 환경에서 사용하려면 클래스 정의도 함께 공유해야 합니다. 보안 경고: 신뢰할 수 없는 출처의 Pickle 파일은 절대 열지 마세요.

Pickle은 임의의 코드를 실행할 수 있어서, 악의적으로 제작된 Pickle 파일은 시스템을 공격할 수 있습니다. 웹에서 받은 데이터를 Pickle로 역직렬화하는 것은 매우 위험합니다.

실무에서 Pickle은 주로 머신러닝 모델 저장, 캐시 구현, 세션 데이터 저장 등에 활용됩니다. 다만 파이썬 전용 포맷이므로 다른 언어와 데이터를 교환해야 할 때는 JSON이나 다른 범용 포맷을 사용하세요.

김개발 씨는 학습된 모델을 Pickle로 저장했습니다. 다음 날 출근해서 모델을 불러오니 3시간의 학습 결과가 그대로 살아있었습니다.

실전 팁

💡 - 바이너리 모드("wb", "rb")를 반드시 사용해야 합니다

  • 신뢰할 수 없는 Pickle 파일은 보안 위험이 있으니 열지 마세요
  • 다른 언어와 데이터를 교환해야 한다면 JSON을 사용하세요

5. with문과 컨텍스트 매니저

코드 리뷰 시간이었습니다. 박시니어 씨가 김개발 씨의 코드를 보더니 미간을 찌푸렸습니다.

"여기 close() 호출이 빠졌네. 예외가 발생하면 파일이 안 닫힐 수도 있어." 김개발 씨는 고개를 숙였습니다.

"매번 close() 쓰기가 어려워요." 박시니어 씨가 미소 지었습니다. "with 문을 알려줄게."

with 문은 리소스를 자동으로 관리해주는 파이썬의 강력한 기능입니다. 파일, 네트워크 연결, 데이터베이스 커넥션 등을 with 문으로 열면, 블록이 끝날 때 자동으로 정리됩니다.

예외가 발생해도 리소스가 확실히 해제되므로, 안전하고 깔끔한 코드를 작성할 수 있습니다.

다음 코드를 살펴봅시다.

# with 문 없이 파일 다루기 - 실수하기 쉽습니다
file = open("data.txt", "r")
try:
    content = file.read()
finally:
    file.close()  # 예외가 발생해도 반드시 실행

# with 문으로 파일 다루기 - 자동으로 닫힙니다
with open("data.txt", "r", encoding="utf-8") as file:
    content = file.read()
    print(content)
# 여기서 자동으로 file.close() 호출

# 여러 파일을 동시에 열기
with open("input.txt", "r") as infile, open("output.txt", "w") as outfile:
    for line in infile:
        outfile.write(line.upper())

김개발 씨는 이상한 버그를 만났습니다. 가끔 파일에 데이터가 저장되지 않는 현상이었습니다.

코드를 아무리 살펴봐도 문제가 없어 보였습니다. 박시니어 씨가 원인을 찾았습니다.

"close()가 호출되기 전에 예외가 발생해서 파일이 제대로 닫히지 않았어." 파일을 열면 운영체제가 해당 파일에 대한 핸들을 할당합니다. close()를 호출해야 이 핸들이 해제되고, 버퍼에 있던 데이터가 디스크에 기록됩니다.

close()가 호출되지 않으면 데이터가 유실될 수 있습니다. try-finally를 사용하면 예외가 발생해도 close()가 호출되도록 할 수 있습니다.

하지만 매번 이렇게 작성하는 것은 번거롭고 코드도 길어집니다. 바로 이 문제를 해결하기 위해 with 문이 등장했습니다.

with 문은 마치 자동문과 같습니다. 들어갈 때 문이 열리고, 나올 때 자동으로 닫힙니다.

문을 닫는 것을 깜빡할 일이 없습니다. with 블록 안에서 어떤 일이 일어나든, 블록을 벗어나면 파일이 자동으로 닫힙니다.

정상적으로 끝나든, 예외가 발생하든, return으로 빠져나가든 상관없습니다. 파이썬이 알아서 처리해줍니다.

as 키워드는 열린 파일 객체에 이름을 붙입니다. as file이라고 쓰면 file이라는 이름으로 파일 객체를 사용할 수 있습니다.

변수명은 자유롭게 지을 수 있습니다. 여러 파일을 동시에 열 수도 있습니다.

쉼표로 구분하여 여러 open() 호출을 나열하면 됩니다. 입력 파일을 읽어 가공한 뒤 출력 파일에 쓰는 작업에서 유용합니다.

with 문은 파일뿐 아니라 다양한 리소스에 사용됩니다. 데이터베이스 연결, 네트워크 소켓, 락(Lock) 등 사용 후 정리가 필요한 모든 리소스에 with 문을 활용할 수 있습니다.

이런 자동 정리 기능을 제공하는 객체를 컨텍스트 매니저라고 합니다. 파이썬 표준 라이브러리의 많은 객체가 컨텍스트 매니저를 지원합니다.

직접 만들 수도 있지만, 일단은 기존 것을 잘 활용하는 것이 중요합니다. 김개발 씨는 모든 파일 처리 코드를 with 문으로 바꿨습니다.

코드가 짧아지고, 버그도 사라졌습니다. "이제 close() 호출을 깜빡할 일이 없겠네요!"

실전 팁

💡 - 파일을 다룰 때는 항상 with 문을 사용하세요

  • with 블록 안에서 예외가 발생해도 리소스가 안전하게 정리됩니다
  • 여러 파일을 동시에 열 때는 쉼표로 구분하여 나열합니다

6. 경로 처리 pathlib

김개발 씨는 리눅스 서버에 배포하다가 당황했습니다. 윈도우에서 잘 돌아가던 코드가 서버에서는 파일을 찾지 못했습니다.

경로 구분자가 달랐기 때문입니다. "운영체제마다 경로 형식이 다르거든.

pathlib을 쓰면 이런 문제를 깔끔하게 해결할 수 있어." 박시니어 씨의 조언이었습니다.

pathlib은 파일 경로를 객체 지향적으로 다루는 모듈입니다. 문자열로 경로를 조작하는 대신, Path 객체의 메서드와 속성을 사용합니다.

운영체제에 관계없이 동일한 코드로 경로를 처리할 수 있어, 크로스 플랫폼 개발에 필수적입니다.

다음 코드를 살펴봅시다.

from pathlib import Path

# 현재 디렉토리와 경로 생성
current = Path.cwd()
print(f"현재 디렉토리: {current}")

# / 연산자로 경로 결합 - 운영체제에 맞게 자동 변환
data_dir = current / "data"
file_path = data_dir / "users.json"
print(f"파일 경로: {file_path}")

# 경로 정보 추출
print(f"파일명: {file_path.name}")        # users.json
print(f"확장자: {file_path.suffix}")      # .json
print(f"부모 디렉토리: {file_path.parent}")  # /path/to/data

# 파일 존재 확인 및 생성
if not data_dir.exists():
    data_dir.mkdir(parents=True)  # 상위 디렉토리까지 생성

# 디렉토리 내 파일 탐색
for json_file in data_dir.glob("*.json"):
    print(f"발견: {json_file}")

윈도우에서는 경로를 "C:\Users\data\file.txt"처럼 역슬래시로 구분합니다. 반면 리눅스와 맥에서는 "/home/user/data/file.txt"처럼 슬래시를 사용합니다.

문자열로 경로를 직접 다루면 이런 차이 때문에 문제가 생깁니다. 예전에는 os.path 모듈로 경로를 다뤘습니다.

os.path.join("data", "file.txt")처럼 함수를 호출해야 했죠. 동작은 하지만 코드가 길어지고 읽기도 불편했습니다.

파이썬 3.4에서 pathlib이 등장했습니다. 경로를 문자열이 아닌 Path 객체로 다룹니다.

객체 지향적인 방식이라 더 직관적이고 강력합니다. 지금은 pathlib이 표준으로 자리 잡았습니다.

Path 객체의 가장 멋진 기능은 / 연산자입니다. "path / folder / file"처럼 슬래시로 경로를 결합할 수 있습니다.

마치 실제 경로를 적는 것처럼 자연스럽습니다. 운영체제에 따라 자동으로 올바른 구분자로 변환됩니다.

**Path.cwd()**는 현재 작업 디렉토리를 반환합니다. 스크립트가 실행되는 위치를 기준으로 상대 경로를 구성할 때 유용합니다.

비슷하게 **Path.home()**은 사용자 홈 디렉토리를 반환합니다. Path 객체는 경로의 각 부분에 쉽게 접근할 수 있는 속성을 제공합니다.

name은 파일명, suffix는 확장자, stem은 확장자를 제외한 파일명, parent는 상위 디렉토리입니다. 문자열을 파싱하는 것보다 훨씬 편리합니다.

exists() 메서드로 경로가 실제로 존재하는지 확인할 수 있습니다. mkdir() 메서드로 디렉토리를 생성하고, parents=True 옵션을 주면 상위 디렉토리까지 한 번에 생성합니다.

glob() 메서드는 패턴에 맞는 파일을 찾습니다. ".json"은 모든 JSON 파일을, "**/.py"는 하위 디렉토리까지 포함한 모든 파이썬 파일을 찾습니다.

파일 탐색이 정말 간단해집니다. Path 객체는 open()과도 잘 어울립니다.

with file_path.open("r") as file처럼 Path 객체의 open() 메서드를 직접 호출할 수도 있습니다. 또는 with open(file_path)처럼 경로를 그대로 전달해도 됩니다.

김개발 씨는 모든 경로 처리 코드를 pathlib으로 바꿨습니다. 이제 윈도우에서 개발하고 리눅스 서버에 배포해도 문제없이 동작합니다.

실전 팁

💡 - 새 프로젝트에서는 os.path 대신 pathlib을 사용하세요

  • / 연산자로 경로를 결합하면 코드가 읽기 쉬워집니다
  • glob("**/*")으로 하위 디렉토리까지 재귀적으로 탐색할 수 있습니다

이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!

#Python#FileIO#CSV#JSON#Pickle#pathlib#Python,IO

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.