본문 바로가기

미래 먹거리를 위하여

[파이썬 정복하기] 라이브러리 6장 - 파일과 디렉터리 다루기1 (맥OS 기준) ★ 라이브러리로 파일 다루기 — pathlib, os.path, fileinput 완전정리

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 폴더 생성 (중간 폴더 포함)
폴더가 잘 만들어지면 → 출력 없음 (정상)

라이브러리 예제 문제: 

점프 투 파이썬 - 라이브러리 예제 편 6장 35번 문제

 

점프 투 파이썬 - 라이브러리 예제 편 6장 35번 문제 해석 및 결과 1

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

점프 투 파이썬 - 라이브러리 예제 편 6장 35번 문제 해석 및 결과 2

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) 함수를 어떻게 만들어야 할까? 단, 하위 폴더에 있는 파이썬 파일들도 모두 찾아야 한다.

점프 투 파이썬 - 라이브러리 예제 편 6장 36번 문제 해석 및 결과

※ 비교: 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)이 너무 많아서 하나씩 열어서 내용을 확인하기가 너무 번거롭다. 이럴 때 모든 텍스트 파일들을 자동으로 읽어서 그 내용들을 한 줄씩 보여주려면 어떻게 코드를 작성해야 할까? 

점프 투 파이썬 - 라이브러리 예제 편 6장 37번 문제 해석 및 결과