프로그래밍 언어/Python

Python 표준 라이브러리 (디렉토리(폴더) -directory(folder)-, os, glob)

dpswlsldj 2021. 3. 1. 12:48
728x90

디렉토리를 관리하기 위해 사용되는 표준 라이브러리는 크게 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']