OS: MAC
참고: 👉 점프 투 파이썬 - 라이브러리 예제 바로가기
035. 파일 경로를 '객체로' 다루려면? ― pathlib(패스립)
| 구분 | 설명 | 예시 | 결과 |
| 기능 요약 | 파일 경로를 단순 문자열이 아니라 객체처럼 다루는 모듈 |
from pathlib import Path p = Path('example/test.txt') print(p) |
example/test.txt |
| 모듈 위치 | 표준 라이브러리 내장 | import pathlib print(pathlib.__file__) |
내장 모듈 (설치 불필요) /opt/homebrew/Cellar/python@3.13/3.13.2/Frameworks/Python.framework/Versions/3.13/lib/python3.13/pathlib/__init__.py |
| Path 객체 생성 | Path('경로') 형식으로 경로 객체를 만듦 |
from pathlib import Path p = Path('C:/Users/user/Documents') |
![]() Path 객체 생성 및 저장 |
| 현재 작업 디렉터리 |
Path.cwd() | from pathlib import Path print(Path.cwd()) |
/Users/유저네임 등 (현재 작업 중인 경로 출력) |
| 홈 디렉터리 | Path.home() | from pathlib import Path print(Path.home()) |
/Users/유저네임 등 사용자 홈 디렉터리 경로 출력 |
| 상위 디렉터리 | .parent 속성 사용 | p = Path('C:/project/code/test.py') print(p.parent) |
C:/project/code |
| 파일명만 가져오기 |
.name, .stem, .suffix | p = Path('data/report.xlsx') print(p.name) print(p.stem) print(p.suffix) |
report.xlsx report .xlsx |
| 경로 결합 (하위 폴더 이동) |
/ 연산자로 경로 결합 가능 | base = Path('C:/Users/user') file = base / 'Desktop' / 'test.txt' print(file) |
C:/Users/user/Desktop/test.txt |
| 존재 여부 확인 | .exists() | p = Path('example.txt') print(p.exists()) |
True 또는 False |
| 파일 / 폴더 구분 | .is_file(), .is_dir() | p = Path('data.csv') print(p.is_file()) |
파일이면 True |
| 파일 목록 확인 | .iterdir() | for f in Path('.').iterdir(): print(f) |
현재 폴더의 파일 / 폴더 목록 출력 |
| 파일 읽기 / 쓰기 | .read_text(), .write_text() |
p = Path('memo.txt') p.write_text('안녕!') print(p.read_text()) |
3 안녕! |
| 절대경로 변환 | .resolve() | p = Path('test.txt') print(p.resolve()) |
/Users/유저네임/test.txt (전체 절대경로 출력) |
| 경로 존재하지 않을 때 자동 생성 | .mkdir(parents=True, exist_ok=True) | Path('logs/today').mkdir(parents=True, exist_ok=True) # 검토 코드 from pathlib import Path p = Path('logs/today') p.mkdir(parents=True, exist_ok=True) print(p.exists()) # True면 성공적으로 만들어진 것! |
logs/today 폴더 생성 (중간 폴더 포함) 폴더가 잘 만들어지면 → 출력 없음 (정상) |
라이브러리 예제 문제:


문제에 나와있는 "archive" 폴더를 생성해 줘야한다.

036. 디렉터리의 구성을 알려면? ― os.path
- pathlib 배우기 전에 자주 쓰이던 기존 방식의 파일·디렉터리 경로 처리 모듈
- 지금도 유지보수 코드나 오래된 프로젝트에선 여전히 자주 등장함.
- os.path는 문자열을 직접 다루기 때문에→ 운영체제 경로 구분자(슬래시/백슬래시) 문제를 신경 써야 함. but pathlib은 이를 객체화해서 / 연산자로 처리 가능
| 구분 | 설명 | 예시 | 결과 |
| 모듈 불러오기 | os.path는 os 안에 포함된 경로 관련 하위 모듈 |
import os.path | |
| 현재 디렉터리 | 현재 작업 경로 확인 | import os print(os.getcwd()) |
/Users/유저네임 |
| 경로 결합 | 운영체제에 맞게 경로 합치기 | import os path = os.path.join('folder', 'test.txt') print(path) |
folder/test.txt |
| 디렉터리명 추출 | 경로 중 디렉터리 부분만 가져오기 | os.path.dirname('/Users/유저네임/test.txt') | '/Users/유저네임' |
| 파일명 추출 | 경로 중 파일명만 가져오기 | os.path.basename('/Users/유저네임/test.txt') | test.txt |
| 디렉터리 + 파일명 분리 | 경로를 폴더와 파일로 한 번에 분리 | os.path.split('/Users/유저네임/test.txt') | (/Users/유저네임, test.txt) |
| 확장자 분리 | 파일명에서 확장자만 따로 추출 | os.path.splitext('test.txt') | (test, .txt) |
| 절대경로 변환 | 상대경로 → 절대경로 | os.path.abspath('test.txt') | /Users/유저네임/test.txt |
| 존재 여부 확인 | 파일 또는 폴더가 실제로 존재하는지 | os.path.exists('/Users/유저네임/test.txt') | True 또는 False |
| 파일인지 확인 | 해당 경로가 파일이면 True | os.path.isfile('test.txt') | False |
| 폴더인지 확인 | 해당 경로가 폴더면 True | os.path.isdir('archive') | True |
| 상대경로 계산 | 두 경로 사이의 상대적 위치 계산 | os.path.relpath('/Users/유저네임/archive', '/Users/유저네임') | 'archive' |
| 경로 정규화 | 중복된 ../, ./ 등을 정리 | os.path.normpath('/Users/유저네임/../archive/./test.txt') | '/Users/archive/test.txt' |
라이브러리 예제 문제: 특정 폴더에 어떤 파이썬 파일들이 들어있는지 찾아보고 싶다. 이럴 때 입력받은 폴더에 있는 모든 파이썬 파일들을 찾아서 보여주는 search(dirname) 함수를 어떻게 만들어야 할까? 단, 하위 폴더에 있는 파이썬 파일들도 모두 찾아야 한다.

※ 비교: os.path vs pathlib
| 기능 | os.path | pathlib(패스립) |
| 현재 경로 | os.getcwd() | Path.cwd() |
| 파일명 | os.path.basename(path) | Path(path).name |
| 폴더명 | os.path.dirname(path) | Path(path).parent |
| 확장자 | os.path.splitext(path)[1] | Path(path).suffix |
| 경로 결합 | os.path.join(a, b) | Path(a) / b |
| 존재 여부 | os.path.exists(path) | Path(path).exists() |
037. 여러 개의 파일을 한꺼번에 읽으려면? ― fileinput(파일인풋)
- fileinput.input()은 리스트로 받은 파일 이름들을 차례로 열고, 내부적으로 한 줄씩 읽어옵니다.
- 그래서 open()을 여러 번 쓸 필요가 없음. 실제로는 여러 파일을 하나의 파일처럼 연속적으로 읽는 느낌.
※ 파일 생성 코드 참고
| with open('a.txt', 'w') as f: f.write('Hello from A\nLine 2') with open('b.txt', 'w') as f: f.write('Hello from B\nLine 2') |
아래 예시를 수행하기 위한 a.txt와 b.txt 파일 생성 |
| 구분 | 설명 | 예시 | 결과 |
| 모듈 이름 | 여러 개의 파일을 한꺼번에 읽을 수 있게 해주는 모듈 |
import fileinput | 여러 파일을 마치 하나의 큰 파일처럼 줄 단위로 읽을 수 있음 |
| 기본 문법 | for line in fileinput.input(files): | import fileinput for line in fileinput.input(['a.txt', 'b.txt']): print(line.strip()) # a.txt와 b.txt의 내용이 순서대로 출력됨 |
Hello from A Line 2 Hello from B Line 2 |
| 표준 입력처리 가능 | 파일명을 지정하지 않으면 표준 입력(stdin)을 읽음 | for line in fileinput.input(): print(line) |
터미널 입력을 실시간으로 읽음 |
| 현재 파일 이름 확인 | fileinput.filename() | for line in fileinput.input(['a.txt', 'b.txt']): print(fileinput.filename(), line.strip()) # 각 줄이 어떤 파일에서 왔는지 표시됨 |
a.txt Hello from A a.txt Line 2 b.txt Hello from B b.txt Line 2 |
| 현재 줄 번호 확인 |
fileinput.lineno() | for line in fileinput.input(['a.txt', 'b.txt']): print(fileinput.lineno(), line.strip()) # 전체 파일 기준으로 줄 번호 표시 |
1 Hello from A 2 Line 2 3 Hello from B 4 Line 2 |
| 각 파일의 줄 번호 확인 |
fileinput.filelineno() | for line in fileinput.input(['a.txt', 'b.txt']): print(fileinput.filelineno(), line.strip()) # 각 파일 내에서 줄 번호 표시 |
1 Hello from A 2 Line 2 1 Hello from B 2 Line 2 |
| 파일이 바뀔 때 감지 |
fileinput.isfirstline() | for line in fileinput.input(['a.txt', 'b.txt']): if fileinput.isfirstline(): print(f"== {fileinput.filename()} ==") print(line.strip()) # 파일이 바뀔 때마다 파일명 헤더 출력 |
== a.txt == Hello from A Line 2 == b.txt == Hello from B Line 2 |
| inplace 인자 | 파일 내용을 직접 수정 (덮어쓰기) 가능 |
for line in fileinput.input('a.txt', inplace=True): print(line.replace('old', 'new'), end='') |
출력값 없음 (a.txt 파일 내용이 직접 수정됨) |
라이브러리 예제 문제: 현재 폴더에 텍스트 파일(.txt)이 너무 많아서 하나씩 열어서 내용을 확인하기가 너무 번거롭다. 이럴 때 모든 텍스트 파일들을 자동으로 읽어서 그 내용들을 한 줄씩 보여주려면 어떻게 코드를 작성해야 할까?

