파이썬, 파일과 폴더를 다루는 예제
from pathlib import Path
import shutil
import os
current_dir = Path(__file__).parent
print(current_dir)
data_dir = current_dir / "data"
print(data_dir)
data_dir2 = Path("data/")
print(data_dir2)
print("iterdir : 하위 폴더는 그냥 폴더명으로 처리")
for file in data_dir.iterdir():
print(file)
print("\nglob : 하위 폴더는 그냥 폴더명으로 처리")
for file in data_dir.glob("*"):
if file.suffix in ["txt", "pdf", "docx", "doc"]:
print("데이터 파일:", file)
elif file.is_dir():
print("하위 폴더:", file)
else:
print("기타 파일:", file)
print("\nrglob : 하위 폴더의 파일도 처리") # recursive glob
for file in data_dir.rglob("*"):
if file.suffix in ["txt", "pdf", "docx", "doc"]:
print("데이터 파일:", file)
elif file.is_dir():
print("하위 폴더:", file)
else:
print("기타 파일:", file)
print("\npath 객체 정보")
path_dir = Path("project/data/data1.txt")
print(path_dir)
print("exists : ", path_dir.exists()) # 파일 존재 여부 True/False
print("is_file : ", path_dir.is_file()) # 파일 여부 True/False
print("is_dir : ", path_dir.is_dir()) # 디렉토리 여부 True/False
print("is_symlink : ", path_dir.is_symlink()) # 심볼릭 링크 여부 True/False
print("is_absolute : ", path_dir.is_absolute()) # 절대 경로 여부 True/False
print("is_relative_to : ", path_dir.is_relative_to(path_dir)) # 상대 경로 여부 True/False
print("is_relative_to : ", path_dir.is_relative_to(data_dir)) # 상대 경로 여부 True/False
print("is_relative_to : ", path_dir.is_relative_to(data_dir2)) # 상대 경로 여부 True/False
print("\npath 객체 정보 정리 1")
print("parent : ", path_dir.parent) # 부모 디렉토리
print("parent == os.path.dirname(path_dir) : ", os.path.dirname(path_dir)) # 부모 디렉토리
print("parents : ", path_dir.parents) # 부모 디렉토리 리스트
print("parents[0] : ", path_dir.parents[0]) # 부모 디렉토리
print("parents[1] : ", path_dir.parents[1]) # 부모 디렉토리
print("parents[2] : ", path_dir.parents[2]) # 부모 디렉토리
# print("parents[3] : ", path_dir.parents[3]) # IndexError: list index out of range
print("\npath 객체 정보 정리 2")
print("stem : ", path_dir.stem) # 파일명(확장자 제외)
print("suffix : ", path_dir.suffix) # 확장자
print("name : ", path_dir.name) # 파일명(확장자 포함)
print("name == os.path.basename(path_dir) : ", os.path.basename(path_dir)) # 파일명(확장자 포함)
print("parts : ", path_dir.parts) # 파일명(확장자 포함)
print("as_posix : ", path_dir.as_posix()) # 파일명(확장자 포함)
# print(path_dir.as_uri())
print("with_suffix : ", path_dir.with_suffix(".csv")) # 파일명(확장자 포함) 바꾸기
print("\npath 객체 정보 정리 3")
print("with_name : ", path_dir.with_name("data2.txt")) # 파일명(확장자 포함) 바꾸기
print("\noutput_dir 객체 생성")
output_dir = current_dir / "output"
print("output_dir : ", output_dir) # c:\project_python\pathlib\output
output_dir = Path("output/")
print("output_dir : ", output_dir) # output
print("\noutput_dir가 없으면 디렉토리 생성")
# output_dir.mkdir(parents=True, exist_ok=True) # "target\output"처럼 target을 먼저 만들어야 하는 경우 parents=True 옵션 사용
# 경로 먼저 존재하는지지 확인하고 없으면 생성
if not output_dir.exists():
output_dir.mkdir(parents=True, exist_ok=True)
print("output_dir 디렉토리 생성 완료")
# 삭제하려면 unlink() 메서드 사용 (파일/디렉토리 모두 삭제 가능)
# output_dir.unlink()
#print("output_dir 디렉토리 삭제 완료")
# 또는 rmdir() 메서드 사용 (디렉토리만 삭제 가능)
# output_dir.rmdir()
# print("output_dir 디렉토리 삭제 완료")
# glob를 이용하여 디레터리의 모든 파일 복사하기
print("\nglob를 이용하여 하위 폴더의 파일을 가져와서 output_dir에 복사")
for file in data_dir.rglob("*"):
if file.is_file():
print("데이터 파일 복사:", file)
shutil.copy(file, output_dir / file.name)
elif file.is_dir():
print("하위 폴더 복사:", file)
shutil.copytree(file, output_dir / file.name)
else:
print("기타 파일 무시:", file)
# shutil.copy(file, output_dir / file.name)
print("\noutput_dir 디렉토리 복사 완료")
# 또는 shutil.copytree를 이용하기
# print("\nshutil.copytree를 이용하여 하위 폴더의 파일을 가져와서 output_dir에 복사")
# shutil.copytree(data_dir, output_dir)
# print("\noutput_dir 디렉토리 복사 완료")
# os.path.walk를 이용하기 (속도가 더 빠름? 파일이 많을수록 차이가 큼)
"""
print("\nos.walk를 이용하여 하위 폴더의 파일을 가져와서 output_dir에 복사")
for root, dirs, files in os.walk(data_dir): # os.walk 사용 (root: 루트 디렉토리, dirs: 하위 디렉토리, files: 파일)
root_path = Path(root) # pathlib 객체로 변환
relative_path = root_path.relative_to(data_dir) # 대상 디렉터리 내의 상대 경로 계산
output_target_dir = output_dir / relative_path
output_target_dir.mkdir(parents=True, exist_ok=True) # 대상 경로에 하위 디렉터리 생성
for file in files: # 파일 복사
source_file = root_path / file
target_file = output_target_dir / file
print(f"파일 복사: {source_file} -> {target_file}")
shutil.copy2(source_file, target_file) # copy2는 메타데이터도 함께 복사합니다.
print("\noutput_dir 디렉토리 복사 완료")
"""
[실행 결과]



반응형
'Python 활용' 카테고리의 다른 글
| pyenv-win + venv으로 파이썬 버전과 가상환경 관리 (0) | 2025.10.09 |
|---|---|
| 파이썬 프로그램을 .exe 실행 파일로 만드는 방법 (PyInstaller) (0) | 2025.10.09 |
| csv 파일을 엑셀에서 열 때 한글이 깨지는 경우 (0) | 2025.05.08 |
| Kivy 파이썬 App (0) | 2025.03.07 |
| Python 3.13에서 GIL을 제거하면 빨라질까? (0) | 2025.02.16 |
