파이썬/Basic

파이썬 파일 및 폴더 다루기 : OS모듈

코샵 2022. 11. 18. 23:54
반응형
os는 Operating system의 약자로 폴더 생성, 파일 삭제, 이름 변경 등 운영체제의 종속 기능을 수행할 수 있는 모듈이다
import os

os를 임포트해주면 사용할 수 있다

 

현재 작업 경로 확인 getcwd()
import os

print(os.getcwd())
>> C:\Users\Administrator

cwd는 Current Work Directory 로 현재 작업 경로를 알려준다. 

 

작업 경로 변경 chdir()
import os
os.chdir(r'C:\Program Files\Windows Defender')
print(os.getcwd())

>> C:\Program Files\Windows Defender
파일 목록 listdir()
import os
os.chdir(r'C:\Program Files\Windows Defender')
print(os.listdir())

>> ['AmMonitoringInstall.mof', 'AMMonitoringProvider.dll', 'AmStatusInstall.mof', 'ClientWMIInstall.mof', 'ConfigSecurityPolicy.exe', 'DefenderCSP.dll', 'EppManifest.dll', 'FepUnregister.mof', 'ko-KR', 'MpAsDesc.dll', 'MpAzSubmit.dll', 'MpClient.dll', 'MpCmdRun.exe', 'MpCommu.dll', 'MpEvMsg.dll', 'MpOAV.dll', 'MpProvider.dll', 'MpRtp.dll', 'MpSvc.dll', 'MsMpCom.dll', 'MsMpEng.exe', 'MsMpLics.dll', 'MsMpRes.dll', 'NisSrv.exe', 'Offline', 'ProtectionManagement.dll', 'ProtectionManagement.mof', 'ProtectionManagement_Uninstall.mof', 'shellext.dll', 'ThirdPartyNotices.txt']

import os
print(os.listdir(r'C:\Program Files\Windows Defender'))

>> ['AmMonitoringInstall.mof', 'AMMonitoringProvider.dll', 'AmStatusInstall.mof', 'ClientWMIInstall.mof', 'ConfigSecurityPolicy.exe', 'DefenderCSP.dll', 'EppManifest.dll', 'FepUnregister.mof', 'ko-KR', 'MpAsDesc.dll', 'MpAzSubmit.dll', 'MpClient.dll', 'MpCmdRun.exe', 'MpCommu.dll', 'MpEvMsg.dll', 'MpOAV.dll', 'MpProvider.dll', 'MpRtp.dll', 'MpSvc.dll', 'MsMpCom.dll', 'MsMpEng.exe', 'MsMpLics.dll', 'MsMpRes.dll', 'NisSrv.exe', 'Offline', 'ProtectionManagement.dll', 'ProtectionManagement.mof', 'ProtectionManagement_Uninstall.mof', 'shellext.dll', 'ThirdPartyNotices.txt']

path를 지정해주지 않으면 현재 작업 경로의 파일 리스트를 리턴합니다

listdir() 응용

이전 포스팅에 있던 listcomprehension을 이용해 원하는 파일 리스트만 뽑아봅시다 

import os

file = os.listdir(r'C:\Program Files\Windows Defender')
file_dll = [dll for dll in file if dll.endswith('.dll') ]
print(file_dll)

>> ['AMMonitoringProvider.dll', 'DefenderCSP.dll', 'EppManifest.dll', 'MpAsDesc.dll', 'MpAzSubmit.dll', 'MpClient.dll', 'MpCommu.dll', 'MpEvMsg.dll', 'MpOAV.dll', 'MpProvider.dll', 'MpRtp.dll', 'MpSvc.dll', 'MsMpCom.dll', 'MsMpLics.dll', 'MsMpRes.dll', 'ProtectionManagement.dll', 'shellext.dll']
커맨드 명령 system()
import os
os.system('ipconfig')

>> 이더넷 어댑터 이더넷 :

   연결별 DNS 접미사. . . . :
   링크-로컬 IPv6 주소 . . . . : 
   IPv4 주소 . . . . . . . . . : 
   서브넷 마스크 . . . . . . . : 
   기본 게이트웨이 . . . . . . :

윈도우 - 명령프롬프트(cmd.exe)나 powershell or 리눅스 - 터미널에서 사용하는 명령어를 사용할 수 있습니다

폴더 생성 mkdirs()  |  makedirs() 

os.mkdir(path, mode=0o777, *, dir_fd=None)

  • path에 입력한 경로에 폴더를 생성합니다 
  • C:\Program Files 폴더에 test 폴더를 만들고 싶다면 os.mkdir(C:\Program Files\test) 와 같이 path를 지정해주어야 합니다
  • 폴더가 이미 존재한다면 에러 발생

makedirs(name, mode=0o777, exist_ok=False)

  • name에 입력한 경로에 폴더를 생성합니다 
  • 재귀 디렉토리 생성 함수로 하위 디렉토리까지 생성 할 수 있습니다
  • exist_ok : 기본값 False. 해당 경로에 폴더가 존재해도 되는지 여부. 참이면 폴더가 있으면 무시 거짓일 땐 에러 발생
폴더 삭제 rmdir()  |  removedirs()

os.rmdir(path, *, dir_fd=None

  • path 경로의 폴더를 삭제합니다
  • 폴더가 존재하지 않거나 비어있지 않으면 에러 발생

os.removedirs(name)

  • path 경로의 폴더를 삭제합니다
  • 마지막 폴더의 삭제가 성공하면 상위로 폴더로 올라오면서 비어있으면 삭제합니다
파일삭제 remove()

os.remove(path, *, dir_fd=None)

  • path 경로의 파일을 삭제합니다 경로가 폴더거나 파일이 존재하지 않으면 에러 발생
  • C:\Program Files\test\test.txt  이런식으로 path를 지정하면 됩니다
이름 변경 & 이동 rename()  |  renames()  |  replace()

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)

  • src 경로의 파일을 dst 경로로 변경&이동 
  • dst가 존재한다면 에러 발생
  • 파일을 이동시키는 경우 해당 폴더가 존재해야 합니다

os.renames(old, new)

  • old 경로의 파일을 new 경로로 변경&이동 시킵니다. 폴더가 존재하지 않는 경우 폴더를 생성해 이동시킴

os.replace(src, dst, *, src_dir_fd=None, dst_dir_fd=None)

  • rename()과 같습니다. 다만 rename()은 플랫폼 마다 다른 에러가 발생하지만 replace()는 같은 에러를 발생시킵니다

os.path 모듈
os.path.join(path, *paths) path와 *paths를 합쳐 디렉토리 경로로 리턴
os.path.split(path) path의 경로를 튜플(head,tail) 형태로 리턴. tail은 최하위(폴더or파일), head는 상위 디렉토리
os.path.splitext(path) path 경로의 파일의 확장자명을 분리해 튜플로 리턴 ex) 'C:\\Program Files\\test' , '.txt' 
os.path.exists(path) path가 존재하면 True 리턴
os.path.isfile(path) path의 파일이 존재 할 때 True 아닐 때 False 리턴
os.path.isdir(path) path의 폴더가 존재 할 때 True 아닐 때 False 리턴
os.path.getsize(path) 폴더나 파일의 바이트(bytes)크기 리턴. 파일의 경우 정확한데 폴더는 제대로 안나오네요
os.path.dirname(path) 디렉토리의 경로만 리턴
os.path.basename(path) 파일 이름만 리턴