디렉토리를 관리하기 위해 사용되는 표준 라이브러리는 크게 os, glob 두 가지가 있습니다.
os 모듈
함수 | 설명 | 사용법 | 결과 |
os.listdir() | 현재 파일 및 디렉토리 목록 | print(os.listdir()) print('---') print(os.listdir('c:\\')) |
['.idea', 'main.py', 'mymodule.py', 'text.txt', 'tistory', 'venv', '__pycache__'] --- ['$Recycle.Bin', ... 이하 생략] |
os.getcwd() | 현재 디렉토리 | print(os.getcwd()) | D:\dev\workspace\python\helloworld\venv\Scripts\python.exe D:\dev\workspace\python\helloworld\main.py D:\dev\workspace\python\helloworld |
os.mkdir() | 디렉토리 생성 | os.mkdir("directory_name") | |
os.path.isdir() | 디렉토리 존재 유무 | print(os.path.isdir("tistory")) print(os.path.isdir("mymodule.py")) |
True False |
os.path.isfile() | 파일 존재 유무 | print(os.path.isfile("tistory")) print(os.path.isfile("mymodule.py")) |
False True |
os.path.exists() | 디렉토리 또는 파일 존재 유무 | print(os.path.exists("tistory")) print(os.path.exists("mymodule.py")) |
True True |
os.path.join() | 디렉토리와 디렉토리 결합 | #결합된 경로를 string으로 return os.path.join(os.getcwd(), "test") #아래와 같이 사용 os.mkdir(os.path.join(os.getcwd(), "test")) |
|
os.path.abspath() | 절대 경로 얻어오기 | print(os.path.abspath(os.getcwd())) | D:\dev\workspace\python\helloworld |
os.path.dirname() | 디렉토리명만 얻기 | print(os.path.dirname(os.getcwd())) | D:\dev\workspace\python |
os.path.basename() | 파일명만 얻기 | print(os.path.basename(os.getcwd())) | helloworld |
os.path.split() | 디렉토리명, 파일명을 나눠 얻기 | print(os.path.split(os.getcwd())) | ('D:\\dev\\workspace\\python', 'helloworld') |
os.path.getsize() | 파일의 크기 얻어오기 | print(os.path.getsize("mymodule.py"))) | 63 #byte 크기 |
os.system() | 명령어 실행 | os.system('dir/w') | Windows의 cmd 창에서 dir/w를 입력한 것과 같은 동작 |
os.popen() | 명령어 실행에 대한 파일 객체 | print(os.popen("dir/w").read()) | Windows의 cmd 창에서 dir/w를 입력한 결과값을 코드 내로 가져올 수 있습니다. |
위에서 dirname()와 basename()의 결과가 각각 현재 디렉토리의 상위 디렉토리, 현재 디렉토리 명인 이유는 디렉토리 그 자체도 결국은 파일이라는 개념 때문입니다.
system 함수를 통해 명령어 수행 시 PyCharm 콘솔에서는 한글이 깨지는 문제가 있습니다. 아래 코드를 추가해주면 콘솔이 UTF-8로 변경되면서 해당 문제가 해결됩니다.
os.system('chcp 65001')
그런데!
chcp 65001로 콘솔을 UTF-8로 변경 후 os.popen()을 테스트 하게되면 에러가 발생합니다.
UnicodeDecodeError: 'cp949' codec can't decode byte 0xec in position 22: illegal multibyte sequence
dir/w 의 결과가 cp949 코덱으로 인코딩 되어 저장되어 있는데 현재의 코드에서는 UTF-8 형태로 읽어오려고 해서 디코딩 에러가 발생한 것입니다.
파일을 여는 io.open() 함수에서는 encoding 방식을 정할 수 있지만[open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)] os.popen()에서는 지원하지 않습니다. [os.popen(command[, mode[, bufsize]])]
그래서 별 수 없이 65001로 변경한 code page를 다시 949로 변경한 후 popen()을 시도합니다.
popen()에서도 read(), readline(), readlines()을 모두 사용할 수 있습니다.
os.system('chcp 949')
print(os.popen("dir/w").read())
glob 모듈
디렉토리 내의 파일을 탐색하여 list 형태로 return해줍니다. 정규표현식을 사용할 수 있습니다.
import glob
print(glob.glob('*.py'))
print(glob.glob('[a]*.*'))
## return 값의 형태
['main.py', 'mymodule.py']
['abc.txt']
'프로그래밍 언어 > Python' 카테고리의 다른 글
Python 표준 라이브러리 (sys) (0) | 2021.03.07 |
---|---|
Python 표준 라이브러리 (날짜, 시간 -datetime) (0) | 2021.03.01 |
PyCharm의 Python console(파이썬 콘솔) 한글 깨짐 문제 해결 (0) | 2021.03.01 |
Python 표준 라이브러리 (파일 -file-) (0) | 2021.03.01 |
Python 패키지 (Package)와 __init__.py (0) | 2021.02.28 |