[Python 모듈] os : 운영 체제와 상호 작용하는 모듈

 

1. os 모듈이란?

 

파이썬 os 모듈은 운영 체제와 상호 작용할 수 있는 기능들을 제공합니다. 이 모듈을 사용하면 다음과 같은 작업을 수행할 수 있습니다.

 

  • 파일 및 디렉토리 생성, 삭제, 이름 변경
  • 파일 시스템 속성 조회 및 수정
  • 환경 변수 관리
  • 시스템 명령어 실행

 

os 모듈은 별도의 설치 과정이 필요없습니다. 모듈을 사용하려면 아래와 같이 import를 하면 됩니다.

 

import os

 


2. 파일과 디렉토리 관리 관련 함수

2.1 os.listdir()

 

os.listdir() 함수는 지정된 디렉토리에 있는 모든 파일과 디렉토리의 이름을 리스트로 반환합니다. 아래 코드를 실행하면 현재 작업 디렉토리에서 파일과 디렉토리 목록이 출력됩니다. 이때, 출력된 목록에는 숨김 파일과 디렉토리도 모두 포함됩니다. 숨김파일과 디렉토리는 이름이 마침표로 시작됩니다. 출력된 목록은 리스트 형태로 반환되므로, 이를 다른 변수에 저장하거나 반복문을 사용하여 처리할 수도 있습니다.

 

import os

# 현재 작업 디렉토리에서 파일과 디렉토리 목록 출력
print(os.listdir())

 


2.2 os.mkdir()

 

os.mkdir() 함수는 지정된 경로에 새로운 디렉토리를 생성합니다. 아래 코드에서 os.mkdir()함수를 사용하여 경로에 새로운 디렉토리를 만들었습니다. 이때, 경로는 운영체제에 따라 구분자가 다를 수 있습니다. 만약 새 디렉토리를 만들 경로에 이미 디렉토리가 존재한다면 FileExistsError 예외가 발생합니다. 

 

import os

# 새 디렉토리를 만들 경로
new_dir_path = "C:/Users/user/Desktop/new_dir"

# 경로에 디렉토리가 존재하는지 확인
if not os.path.exists(new_dir_path):
    # 디렉토리 생성
    os.mkdir(new_dir_path)
else:
    print(f"{new_dir_path} 경로에 이미 디렉토리가 존재합니다.")

 


2.3 os.rmdir()

os.rmdir() 함수는 지정된 경로의 디렉토리를 삭제합니다. 단, 디렉토리가 비어 있어야 합니다. 아래 코드에서 os.rmdir()함수를 사용하여 경로에 있는 디렉토리를 삭제합니다. 삭제할 디렉토리에 파일이나 하위 디렉토리가 있으면 OSError 예외가 발생합니다. 따라서, 해당 디렉토리를 삭제하기 전에 디렉토리 내의 파일과 하위 디렉토리를 먼저 삭제해야 합니다. 그래서 코드에서 os.walk() 함수를 사용하여 디렉토리 내의 파일과 하위 디렉토리를 순회하면서 삭제한 후 마지막으로 해당 디렉토리를 삭제합니다. 

 

os.walk()함수는 지정된 디렉토리를 재귀적으로 순회하면서, 각 디렉토리 내의 파일과 하위 디렉토리를 차례로 반환하는 함수입니다. topdown=False 옵션을 주면, 하위 디렉토리를 먼저 순회하고 그 다음에 상위 디렉토리를 순회하게 됩니다.

 

import os

# 삭제할 디렉토리 경로
dir_path = "C:/Users/user/Desktop/new_dir"

# 디렉토리 내의 파일과 하위 디렉토리 삭제
for root, dirs, files in os.walk(dir_path, topdown=False):
    for name in files:
        file_path = os.path.join(root, name)
        os.remove(file_path)
    for name in dirs:
        dir_path = os.path.join(root, name)
        os.rmdir(dir_path)

# 디렉토리 삭제
os.rmdir(dir_path)

 


2.4 os.rename()

 

os.rename() 함수는 파일이나 디렉토리의 이름을 변경합니다. 아래 코드에서 os.rename() 함수를 사용하여 경로에 있는 파일의 이름을 new_file.txt로 변경했습니다. op.path.dirname() 함수를 사용하여 파일 경로의 디렉토리 부분을 추출하고, os.path.join() 함수를 사용하여 새로운 파일 경로를 생성하였습니다.

 

import os

# 이름을 변경할 파일 경로
file_path = "C:/Users/user/Desktop/old_file.txt"

# 새로운 파일 이름
new_file_name = "new_file.txt"

# 파일 이름 변경
os.rename(file_path, os.path.join(os.path.dirname(file_path), new_file_name))

 

아래 코드에서는 경로에 있는 디렉토리의 이름을 new_dir로 변경했습니다. 마찬가지로 os.path.dirname()함수를 사용하여 디렉토리 경로의 상위 디렉토리를 추출하고 os.path.join() 함수를 사용하여 새로운 디텍토리 경로를 생성하였습니다.

 

import os

# 이름을 변경할 디렉토리 경로
dir_path = "C:/Users/user/Desktop/old_dir"

# 새로운 디렉토리 이름
new_dir_name = "new_dir"

# 디렉토리 이름 변경
os.rename(dir_path, os.path.join(os.path.dirname(dir_path), new_dir_name))

 


3. 파일 시스템 속성 관련 함수

3.1 os.stat()

 

os.stat() 함수는 파일이나 디렉토리에 대한 정보를 반환합니다. 반환되는 정보에는 크기, 수정 시간, 접근 시간 등이 포함됩니다. 아래 코드에서 os.stat() 함수를 사용하여 경로에 있는 파일의 상태 정보를 가져왔습니다. 이때 st_size 속성을 사용하여 파일 크기를, st_mtime 속성을 사용하여 최종 수정 시간을 가져왔습니다. 최종 수정 시간은 st_mtime 속성으로부터 반환된 POSIX시간을 datetime.datetime.fromtimestamp() 함수를 사용하여 사람이 읽을 수 있는 형태로 변환하였습니다.

 

import os

# 상태 정보를 얻을 파일 경로
file_path = "C:/Users/user/Desktop/file.txt"

# 파일의 상태 정보 가져오기
file_stat = os.stat(file_path)

# 파일 크기 출력
print(f"파일 크기: {file_stat.st_size} bytes")

# 최종 수정 시간 출력
import datetime
mod_time = datetime.datetime.fromtimestamp(file_stat.st_mtime)
print(f"최종 수정 시간: {mod_time}")

 


3.2 os.chmod()

 

os.chmod() 함수는 파일이나 디렉토리의 권한을 변경합니다. 아래 코드에서 os.chmod 함수를 사용하여 경로에 있는 파일의 권한을 변경하였습니다. 이때 권한을 변경하기 전과 후에 os.stat()함수를 사용하여 파일의 상태 정보를 가져와서 권한 정보를 출력하였습니다. 권한 정보는 8진수로 표현되며, 맨 끝 3자리가 실제 권한을 나타냅니다.

 

import os

# 권한을 변경할 파일 경로
file_path = "C:/Users/user/Desktop/file.txt"

# 파일의 현재 권한 출력
print(f"파일의 현재 권한: {oct(os.stat(file_path).st_mode)[-3:]}")

# 파일 권한 변경 (읽기/쓰기 권한 추가)
os.chmod(file_path, 0o600)

# 파일의 변경된 권한 출력
print(f"파일의 변경된 권한: {oct(os.stat(file_path).st_mode)[-3:]}")

 


3.3 os.path 모듈

 

os.path 모듈은 경로와 관련된 여러 유용한 함수를 제공합니다. 이 모듈의 함수를 사용하면 경로의 분리, 결합, 확장자 추출 등의 작업을 수행할 수 있습니다. 아래 코드는 os.path 모듈을 사용하여 파일 결로에서 파일 이름과 확장자를 추출하는 코드입니다. 코드에서 os.path.basename() 함수를 사용하여 파일 경로에서 파일 이름을 추출하였습니다. 다음으로, os.path.splitext() 함수를 사용하여 파일 결로에서 확장자를 추출하였습니다.

 

코드에는 없지만 이외에도 os.path.join() 함수, os.path.abspath()함수등이 있습니다. os.path.join() 는 여러 개의 경로를 연결하여 새 경로를 생성하는 함수이고, os.path.abspath()함수는 상대 경로를 절대 경로로 변환하는 함수입니다.

 

import os

# 파일 경로
file_path = "C:/Users/user/Desktop/file.txt"

# 파일 이름 추출
file_name = os.path.basename(file_path)
print(f"파일 이름: {file_name}")

# 파일 확장자 추출
file_ext = os.path.splitext(file_path)[-1]
print(f"파일 확장자: {file_ext}")

 


4. 작업 환경 관리 관련 함수

4.1 os.environ

 

os.environ 객체는 환경 변수에 대한 정보를 딕셔너리 형태로 저장하고 있습니다. 이 객체를 사용하면 환경 변수를 읽거나 설정할 수 있습니다. 아래 코드는 os.environ.get() 함수를 사용하여 PATH 환경 변수의 값을 가져왔습니다. 

 

import os

# PATH 환경 변수의 값을 가져오기
path = os.environ.get('PATH')
print(f"PATH 환경 변수: {path}")

 

os.environ변수를 사용하여 환경 변수의 값을 변경할 수도 있습니다. 아래 코드는 os.environ 변수에 새로운 키-값 쌍을 추가하여 환경 변수를 생성하는 코드입니다. 이때 os.environ 변수는 딕셔너리와 같이 동작하기 때문에, 대괄호 ('[]')를 사용하여 새로운 키-값 쌍을 추가합니다.

 

import os

# 환경 변수 생성 및 값 설정
os.environ['MY_VAR'] = 'Hello, World!'

# 값 확인
my_var = os.environ.get('MY_VAR')
print(f"MY_VAR 환경 변수: {my_var}")

4.2 os.system()

os.system() 함수는 시스템 명령어를 실행합니다. 아래 코드에서 os.system() 함수를 사용하여 dir 명령어를 실행하였습니다. os.system() 함수는 인자로 전달된 명령어를 시스템 셸에서 실행하고, 명령어의 종료 코드를 반환합니다. 명령어 실행 결과는 셸에서 직접 출력되며, 프로그램에서는 출력된 결과를 처리하지 않습니다.

 

import os

# 시스템 명령어 실행
os.system("dir")