카테고리 없음

Python - pathlib, File/Directory Path 관련 모듈

TechNote.kr 2019. 9. 2. 23:30
728x90

 

>>> from pathlib import Path
>>> Path("/home/ubuntu")
PosixPath('/home/ubuntu')

pathlib 는 python 3.4 에서 처음 소개 되었다. 


서로 다른 운영체제의 파일 시스템에서도 동일한 코드를 통해 동작할 수 있도록 Object-oriented (객체지향)으로 구현되어 있는 특징이 있다. 

I/O 동작 포함 여부에 따라 다음과 같이 2가지 형태로 구분된다.

  • PurePath : 실질적인 File system 접근 (I/O 동작) 없이 File/Directory Path 만 계산
    • PurePosixPath : non-Windows 파일 시스템의 특성에 따라 동작 수행
    • PureWindowsPath : Windows 파일 시스템의 특성에 따라 동작 수행
  • Path : Concrete path 라고도 불리며 File system 접근 (I/O 동작) 까지 포함
    • PosixPath : non-Windows 파일 시스템 상에서 I/O를 포함한 File system path 관련 동작 수행
    • WindowsPath : Windows 파일 시스템 상에서 I/O를 포함한 File system path 관련 동작 수행

실질적인 File system 접근 (I/O 동작) 없이 File/Directory Path 만 계산하는 PurePath, PurePosixPath, PureWindowsPath 사용의 예는 다음과 같다. 

 

PurePath

>>> from pathlib import PurePath
>>>
>>> PurePath("/home/ubuntu")
PurePosixPath('/home/ubuntu')
>>>
>>> PurePath("/home/ubuntu1")
PurePosixPath('/home/ubuntu1')

실제로 존재하지 않는 "/home/ubuntu1" 도 정상적으로 동작한다. 

 

PurePosixPath

>>> from pathlib import PurePosixPath
>>>
>>> PurePosixPath("/home/ubuntu")
PurePosixPath('/home/ubuntu')
>>> 
>>> PurePosixPath("C:/home")
PurePosixPath('C:/home')
>>>
>>> PurePosixPath("C:\")
  File "<stdin>", line 1
    PurePosixPath("C:\")
                       ^
SyntaxError: EOL while scanning string literal

Ubuntu 상에서 실행하고 있고, PurePosixPath 라서 Windows에서 흔히 사용하는 방식의 path 입력시 error 가 날 것이라고 생각했는데, "C:/home" 과 같이 입력을 해도 error는 발생하지 않았다. 

 

다만 Windows의 cmd 상에서는 흔히 C:\ 와 같이 역슬래시를 사용하는데, 이는 escape 문자를 표현할 때 사용하는 문자여서 그런지 SyntaxError 가 발생하였다. 

>>> PurePosixPath("/home/ubuntu") == PurePosixPath("/HOME/UBUNTU")
False

Posix Filesystem 의 특성과 같이 경로는 대소문자를 구분해서 위와 같이 대소문자가 다를 경우 서로 다른 경로로 판단하게 된다. 

 

PureWindowsPath 

>>> from pathlib import PureWindowsPath
>>> 
>>> PureWindowsPath("C:/home")
PureWindowsPath('C:/home')
>>>
>>> PureWindowsPath("/home")
PureWindowsPath('/home')

Ubuntu 상에서도 PurePosixPath 와 마찬가지로 잘 동작하였다. 

>>> PureWindowsPath("/home/ubuntu") == PureWindowsPath("/HOME/UBUNTU")
True

Windows Filesystem 의 특성과 같이 대소문자를 구분하지 않기 때문에 서로 다른 대소문자에도 같은 경로로 판단하고 있다. 

 

>>> PurePosixPath("/home/ubuntu") == PureWindowsPath("/home/ubuntu")
False

표기한 경로가 서로 같더라도 PurePosixPath, PureWindowsPath 가 다를 경우 서로 다른 경로로 판단한다. 

 


 File system 접근 (I/O 동작) 까지하는 Path, PosixPath, WindowsPath 사용의 예는 다음과 같다. 

 

Path

>>> from pathlib import Path
>>> Path("/home/ubuntu")
PosixPath('/home/ubuntu')
>>>
>>> Path("/home/ubuntu1")
PosixPath('/home/ubuntu1')

 실제로 존재하지 않는 path 를 넣어도 정상적으로 생성된다.

 

PosixPath

>>> from pathlib import PosixPath
>>> PosixPath("/home/ubuntu")
PosixPath('/home/ubuntu')

 Ubuntu 상에서 실행한 상황으로 에러 없이 정상적으로 실행이 된다. 만약 Windows 상에서 실행하였다면 error 가 발생하였을 것이다. 

 

WindowsPath

>>> from pathlib import WindowsPath
>>> WindowsPath("/home/ubuntu")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/pathlib.py", line 972, in __new__
    % (cls.__name__,))
NotImplementedError: cannot instantiate 'WindowsPath' on your system

 Windows 가 아닌 Ubuntu 상에서 WindowsPath 를 생성하게 되면 PureWindowsPath 와는 달리 NotImplementedError 가 발생하는 것을 볼 수 있다. 

 


Methods 와 Properties

하기 PurePath 의 Method 와 Properties 이지만 Path 에서도 상속하고 있기 때문에 Path 에서도 동일하게 사용할 수 있다. 

 

 

Path Class

 

PurePath.parent 

PurePath.parents

 

주어진 경로의 상위 directory 를 확인할 수 있다. 

PurePath.parent 로 바로 위 디렉토리를 확인할 수도 있고, PurePath.parents 를 통해 depth 별로 배열을 통해 추출할 수도 있다. 

>>> from pathlib import PurePath
>>>
>>> sample = PurePath("/abc/bcd/def/fgh")
>>>
>>> sample.parent
PurePosixPath('/abc/bcd/def')
>>>
>>> sample.parents
<PurePosixPath.parents>
>>>
>>> sample.parents[0]
PurePosixPath('/abc/bcd/def')
>>> sample.parents[1]
PurePosixPath('/abc/bcd')
>>> sample.parents[2]
PurePosixPath('/abc')
>>> sample.parents[3]
PurePosixPath('/')


PurePath.name

>>> from pathlib import PurePath
>>>
>>> sample = PurePath("/abc/bcd/def/fgh")
>>> 
>>> sample.name
'fgh'

parent 와 달리 디렉토리 부분을 보여주는 것이 아니라 파일 부분을 추출한다. 

 

 

PurePath.suffix

PurePath.suffixes

>>> from pathlib import PurePath
>>>
>>> sample = PurePath("/abc/bcd/def/fgh.tar.gz")
>>>
>>> sample.suffix
'.gz'
>>> 
>>> sample.suffixes
['.tar', '.gz'] 

파일의 확장자를 추출하기 위한 method 이다. suffix 만 사용할 경우 제일 마지막 확장자를 돌려주고, suffixes 를 사용할 경우 여러 확장자를 가지고 있을 경우 배열로 돌려준다.

 

 

PurePath.stem

>>> from pathlib import PurePath
>>>
>>> sample = PurePath("/abc/bcd/def/fgh.tar.gz")
>>> sample.stem
'fgh.tar'
>>>
>>> sample = PurePath("/abc/bcd/def/fgh.tar")
>>> sample.stem
'fgh'
>>>
>>> sample = PurePath("/abc/bcd/def/fgh")
>>> sample.stem
'fgh'

확장자를 제외한 파일명 부분을 추출한다. 

 


PurePath.is_absolute()

>>> from pathlib import PurePath
>>> 
>>> sample = PurePath("/abc/bcd/def/fgh")
>>> sample.is_absolute()
True
>>> 
>>> sample = PurePath("./fgh")
>>> sample.is_absolute()
False

주어진 경로가 절대 경로인지, 상대 경로인지 판단하는 method 이다.

 

 

PurePath.match(pattern)

>>> from pathlib import PurePath
>>> 
>>> sample = PurePath("/abc/bcd/def/fgh")
>>>
>>> sample.match("*/def/*")
True
>>>
>>> sample.match("*/*gh")
True
>>> 
>>> sample.match("*/f*gh")
True
>>>
>>> sample.match("*/fgh")
True
>>>
>>> sample.match("*/fgh/abc")
False

주어진 pattern 과 주어진 경로가 일치하는지 확인한다. 

 


PurePath.relative_to(*other)

>>> from pathlib import PurePath
>>> 
>>> sample = PurePath("/abc/bcd/def/fgh")
>>> sample.relative_to("/abc/bcd")
PurePosixPath('def/fgh')
>>>
>>> sample.relative_to("/bcd")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/pathlib.py", line 864, in relative_to
    .format(str(self), str(formatted)))
ValueError: '/abc/bcd/def/fgh' does not start with '/bcd'

 인자로 받은 경로를 기준으로 상대 경로를 구한다.

 

 

PurePath.with_name(name)

>>> from pathlib import PurePath
>>> 
>>> sample = PurePath("/abc/bcd/def/fgh.txt")
>>> sample.with_name("abc.zip")
PurePosixPath('/abc/bcd/def/abc.zip')

인자로 받은 파일 이름으로 변경한다. 

 


PurePath.with_suffix(suffix)

>>> from pathlib import PurePath
>>> 
>>> sample = PurePath("/abc/bcd/def/abc.zip")
>>> sample.with_suffix(".txt")
PurePosixPath('/abc/bcd/def/abc.txt')

파일 확장자만 변경한다. 

 

 

 

 

 

728x90