(python) directory parse / glob / pathlib
1
2
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
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
>>> 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
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.