Post

(python) directory parse / glob / pathlib

1
2
3
os.getcwd() # working directory == python command를 실행한 path
os.path.dirname(os.path.abspath(\_\_file\_\_)) # 현재 파일이 위치한 directory

디렉토리의 파일을 얻는 방법은 os.listdir()glob.glob() 두 가지가 있다.

3.4 부터 pathlib이라는 고수준 파일 시스템 모듈이 있으니 이걸 쓰는게 좋다.

1
2
3
4
5
6
from pathlib import Path
p = Path('.')
attack\_packages = [x.resolve() for x in p.iterdir() if x.is\_dir()]
a.suffix    # asdf.py이면 .py 반환
a.stem      # asdf.py이면 asdf 반환

os.listdir(path)

filename만 반환한다. 그래서 os.path.join(dir, filename)으로 이어줘야 한다.

glob.glob(patten, *, recursive=False)

filepath를 반환하며 patten 검색, recursive 검색 등을 지원한다. path를 반환하기 때문에 파일 이름만 얻어내려면 os.path.split(str)로 잘라내야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> fpaths = glob.glob("./imgs/\*")
>>> fpaths
['./imgs/4.png', './imgs/2.png']
>>> fnames = [os.path.split(f) for f in fpaths]
>>> fnames
[('./imgs', '4.png'), ('./imgs', '2.png')]
>>> fnames = [os.path.split(f)[1] for f in fpaths]
>>> fnames
['4.png', '2.png']
>>> fnames = [os.path.splitext(f)[0] for f in fnames]
>>> fnames
['4', '2']
## 이렇게도 할 수 있는데 좀 직관적이지 못하다.
files2 = list(map(lambda x: os.path.split(x)[1], fullpaths))

recursive=True인 경우 경로 끝에 \*\*을 적어야 하위 디렉토리까지 recursive하게 탐색한다. \*/\*/...으로 타고 들어가는 방법도 있으니 참고.

아무튼, 파일 이름만 필요한 경우 os.listdir()을 사용하고, fullpath가 필요하거나 특정 파일만 검색하거나 recursive 검색 해야하는 경우 glob.glob()을 사용하면 된다. 이를 반대로 사용하면 약간 번거로운 과정을 거쳐야한다.

파일 존재 유무 확인
1
2
3
4
5
import os
os.path.isfile(file)
os.path.isdir(diretory)
os.path.exists(file\_or\_directory)

\* 같은 메타 문자는 안먹힌다.

This post is licensed under CC BY 4.0 by the author.