파이썬, 파일과 폴더를 다루는 예제

 

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 디렉토리 복사 완료")
"""

 

 

[실행 결과]

 

 

 

 

반응형

+ Recent posts