파이썬 pathlib 사용법
파이썬에서는 os.path 라는 파일 시스템 내의 경로를 다루는 모듈이 있습니다. 이 모듈을 주로 사용하던 예전에는 파일 시스템 내의 경로는 문자열로만 표현되었습니다. 그래서 경로관련 조작을 위해서는 os.path가 사용하는 함수를 사용해야 했습니다. 그러다보니, 특정한 경로를 생성하는 것도 상당히 불편한 점이 많았습니다.
pathlib은 파일시스템의 경로를 객체지향적인 인터페이스로 조작할 수 있도록 하는 API입니다. “새로운”이라는 표현을 쓰는 것도 애매한 것이, 출시된 지는 10년이 넘었기 때문입니다. (python 3.4에 추가) pathlib을 사용하면 문자열 및 os.path 라이브러리를 사용하는 것보다 여러 모로 직관적이고 편리합니다. 특히 윈도와 유닉스 계열 OS가 경로 구분자가 다른 것 때문에 귀찮고 애매했던 점들을 고려할 필요가 없다는 점에서 윈도 환경에서 사용 시 번거로운 골칫거리들을 제거할 수 있는 좋은 수단입니다.
Path
pathlib.Path는 현재 플랫폼에 대응하는 경로 객체를 나타내는 객체입니다. 윈도 환경에서는 WindowsPath 객체를 뜻합니다.
Path 객체를 생성할 때 타깃이 되는 위치를 절대경로나 상대경로를 표현하는 문자열을 사용해서 지정할 수 있습니다. 지정하지 않는다면 현재 경로를 표현하는 Path 객체가 생성됩니다. 참고로 윈도 환경에서도 디렉토리 구분자를 슬래시(/)로 사용하더라도 Path 생성자는 이를 잘 이해할 수 있습니다.
경로 합치기
전통적인 경로 합성 방법은 os.path.join() 함수를 사용하는 것입니다. "/" 문자를 사용해서 각 경로 부분을 합쳐주는 것과 같지만, 플랫폼에 따라서 os.path.sep 문자를 사용하여 합치는 차이가 있습니다. pathlib에서는 Path.joinpath() 메서드를 사용하거나, 단순히 / 연산자를 사용하는 것으로 경로 합치기가 가능합니다. 합치는 대상은 상대경로를 나타내는 Path 객체나 일반 문자열도 무관합니다.
경로 구성 요소
path.absolute(): 가리키는 경로를 절대 경로로 변환한 Path 를 반환path.parent: 가리키는 경로의 부모 Path를 반환합니다. 만약Path('.')으로 생성된 현재 경로에 대한 상대 경로에 대해 부모를 획득하려하면 자기 자신을 반환합니다.path.parents: 가리키는 경로의 부모에 대한 반복자를 반환합니다. 절대 경로인 경우에는 최상위 위치까지, 상대경로인 경우에는 해당 경로 내의 단계를 거슬러 오릅니다.path.parts: 경로의 각 요소를 분해하여 리스트로 반환합니다.path.is_file(),path.is_dir(): 경로가 실제 파일이나 디렉토리를 가리키는지 확인합니다. 존재하지 않는 경로에 대해서는 항상 False를 반환합니다.path.exists(): 실제 존재하는 경로인지 확인합니다.path.name: 마지막 단계의 이름입니다. 디렉토리 명이거나 확장자를 포함한 파일명입니다.path.stem,path.suffix: 파일인 경우 파일명과 확장자를 참조합니다. 확장자는 ’.’을 포함합니다.path.with_name(),path.with_stem(),path.with_suffix: 이름, 스템, 확장자만 변경한 새로운 경로를 만듭니다. 경로를 만드는 것이지 파일명을 변경하지는 않습니다.
파일열기
Path는 file-like 객체로 취급되며, open() 등의 함수에서 파일경로명 문자열 대신 사용이 가능합니다. 또한 그 자체로 파일의 내용에 액세스할 수 있는 기능도 제공하고 있습니다.
p.open(mode=, encoding=..):open()함수와 같이 path 객체가 가리키는 경로의 파일을 지정한 모드로 열고 파일 객체를 반환합니다. 이 함수는 컨텍스트 매니저 프로토콜, 즉 with 구문도 지원합니다.p.read_bytes(): 가리키는 대상이 존재하는 파일인 경우, 해당 파일을 열어서 내용을 바이트 배열로 읽어 들입니다.p.read_text(encoding=): 가리키는 대상이 존재하는 파일인 경우, 해당 파일을 열어서 내용을 문자열로 읽어들입니다.
파일 이름 변경하기
Path 객체는 rename() 메소드를 사용하여 파일의 이름변경 및 경로변경(이동)을 지원합니다. rename() 이라는 이름과 달리, 새로운 경로를 지정하여 이동시키는 것임에 유의해야 합니다. 경로를 유지하고 이름만 변경하려는 경우, path.with_name() 메소드를 사용하여 새로운 이름을 가진 경로를 생성하고, 이를 rename()에 전달하면 됩니다.
패턴 매칭하기
특정한 경로를 기준으로 하위 디렉토리나 파일을 검색할 때에는 전통적으로 glob.glob()나 os.walk()를 사용했습니다. Path 객체도 glob()라는 메소드를 제공하여 주어진 패턴에 매칭하는 파일이나 디렉토리를 검색할 수 있습니다. 특히 **/*.txt 와 같은 패턴을 사용하면 윈도 환경에서도 하위 디렉토리를 재귀적으로 탐색하며 모든 텍스트 파일을 찾을 수 있습니다.
또한 path.match(pattern)을 사용하여 특정한 경로가 해당 패턴에 매치하는지 여부도 검사할 수 있습니다.