[Python] 파이썬 자동화 기초 : 파일시스템 및 폴더 제어, 로그 쓰기 명령어 모음

[Python] 파이썬 자동화 기초 : 파일시스템 및 폴더 제어, 로그 쓰기 명령어 모음

이 포스트는 파이썬에서 파일이나 폴더를 제어하는(생성, 조회, 변경, 삭제하는) 자동화 명령어를 정리했다.

작업 경로 설정하기

현재 작업 경로 출력

현재 작업 경로를 줄여서 CWD(Current Working Directory) 라고 부르는 듯.

기본값은 프로그램이 실행되는 현재 경로임.

import os # 현재 작업경로 출력 (Current Working Directory) print(os.getcwd())

현재 작업 경로 변경

상대경로 변경도 되고 절대경로 변경도 된다.

# 1. 현재 작업 경로 변경 (상대경로) # 상위 폴더로 이동 os.chdir(“..”) print(os.getcwd()) # 상위 폴더의 상위 폴더로 이동 os.chdir(“../..”) print(os.getcwd()) # 2. 현재 작업 경로 변경 (절대경로) # 경로 앞에 r을 붙이는 이유는 오류 방지 (역슬래시가 이스케이프 문자로 적용되는 일을 방지) os.chdir(r”C:\test”) print(os.getcwd())

파일 경로 만들기 (폴더경로와 파일명 결합하기)

# 파일 경로 # 파일 경로 만들기 절대경로를 얻는다 file_path= os.path.join(os.getcwd(), “filename.txt”) print(file_path)

폴더 경로 가져오기 (전체 경로에서 파일명만 떼어내기)

dir_path = os.path.dirname(r”C:\coding\python-workspace\pythonProject\filename.txt”) print(dir_path)

파일 정보 가져오기

파일 만든 날짜

ctime = os.path.getctime(r”C:\test\test.txt”) print(ctime) # => 1643003377.320888 ctime2 = datetime.datetime.fromtimestamp(ctime) print(ctime2) # => 2022-01-24 14:49:37.320888 ctime3 = datetime.datetime.fromtimestamp(ctime).strftime(“%Y-%m-%d %H:%M:%S”) print(ctime3) # => 2022-01-24 14:49:37

파일 수정한 날짜

mtime = os.path.getmtime(r”C:\test\test.txt”) mtime2 = datetime.datetime.fromtimestamp(mtime).strftime(“%Y-%m-%d %H:%M:%S”) print(mtime2) # => 2019-11-22 01:04:38

파일 엑세스한 날짜

atime = os.path.getatime(r”C:\test\test.txt”) atime2 = datetime.datetime.fromtimestamp(atime).strftime(“%Y-%m-%d %H:%M:%S”) print(atime2) # => 2022-01-24 14:49:37

파일 용량 가져오기 (byte 단위)

file_size = os.path.getsize(r”C:\test\test.txt”) print(file_size) # => 136580

파일 목록 가져오기

모든 폴더 및 파일 가져오기

# (현재 작업경로 기준으로) 모든 폴더 및 파일 가져오기 print(os.listdir()) # (특정 폴더 기준으로) 모든 폴더 및 파일 가져오기 print(os.listdir(r”C:\test”)) # 리스트 형태로 리턴됨 => [‘file1.txt’, ‘file2.txt’, ‘folder1’, ‘folder2’, ‘test.txt’]

n단계 하위 폴더 모두 포함해서, 모든 폴더 및 파일 가져오기

# 파일 목록 제너레이터 타입으로 가져오기 (n단계 하위 폴더 모두 포함) result = os.walk(r”C:\test”) for root, dirs, files in result: print(“root :”, root) print(“dirs :”, dirs) print(“files :”, files) print(” “) ##### # root : C:\test # dirs : [‘folder1’, ‘folder2’] # files : [‘file1.txt’, ‘file2.txt’, ‘test.py’, ‘test.txt’] # # root : C:\test\folder1 # dirs : [‘child_folder1’, ‘child_folder2’] # files : [] # # root : C:\test\folder1\child_folder1 # dirs : [] # files : [‘child_file1.txt’] # # root : C:\test\folder1\child_folder2 # dirs : [] # files : [] # # root : C:\test\folder2 # dirs : [] # files : []

n단계 하위 폴더 모두 포함해서, 특정 파일명 찾기

# 특정 파일명 찾기 target_name = “test.txt” result = [] for root, dirs, files in os.walk(r”C:\test”): if target_name in files: result.append(os.path.join(root, target_name)) print(result) # => [‘C:\\test\\test.txt’]

n단계 하위 폴더 모두 포함해서, 특정 패턴으로 파일명 찾기

# 특정 패턴으로 파일명 찾기 import fnmatch patten = “*.py” result = [] for root, dirs, files in os.walk(r”C:\test”): for file_name in files: if fnmatch.fnmatch(file_name, patten): result.append(os.path.join(root, file_name)) print(result) # => [‘C:\\test\\test.py’]

파일 제어하기

주어진 경로가 파일인지 폴더인지 확인

# 주어진 경로가 파일인지 확인 print(os.path.isfile(r”C:\test\test.txt”)) # True print(os.path.isfile(r”C:\test”)) # False # 주어진 경로가 폴더인지 확인 print(os.path.isdir(r”C:\test\test.txt”)) # False print(os.path.isdir(r”C:\test”)) # True

주어진 경로가 존재하는지 확인

print(os.path.exists(r”C:\test”))

새 파일 생성 (내용이 비어있는 파일 생성)

# 새 파일 생성 (내용이 비어있는 파일 생성) open(“file_name.txt”, “a”).close()

파일명 변경

# 파일명 변경하기 os.rename(“file_name.txt”, “file_rename.txt”)

파일 삭제하기

# 파일 삭제하기 os.remove(“file_rename.txt”)

파일 복사하기

copy 또는 copyfile 함수는 메타정보 복사하지 않음

# 파일 복사하기 # 원본 파일경로, 결과 폴더경로 또는 결과 파일경로 shutil.copy(“file1.txt”, “folder1”) # 폴더경로 쓰면 해당 폴더 안에 카피됨 shutil.copy(“file1.txt”, “folder1/copied_file.txt”) # 파일경로 쓰면 해당 파일명으로 카피됨 # 원본 파일경로, 결과 파일경로 shutil.copyfile(“file1.txt”, “copied_file2.txt”)

파일 메타정보까지 복사하기

copy2 함수는 메타정보(만든 날짜, 수정한 날짜, 엑세스한 날짜)까지 복사함

# 원본 파일경로, 결과 폴더경로 또는 결과 파일경로 shutil.copy2(“file1.txt”, “folder2”) # 폴더경로 쓰면 해당 폴더 안에 카피됨 shutil.copy2(“file1.txt”, “folder2/copied_file.txt”) # 파일경로 쓰면 해당 파일명으로 카피됨

폴더 제어하기

폴더 생성하기

os.mkdir(“folder_name”)

하위 폴더까지 생성하기

os.makedirs(“folder_name/f1/f2/f3”)

폴더 삭제하기

# 폴더 삭제하기 (폴더 안이 비었을 때만 삭제 가능) # (폴더 안이 비어있지 않으면, OSError: [WinError 145] 디렉터리가 비어 있지 않습니다: ‘폴더명’ 오류 발생함) os.rmdir(“folder_name”)

폴더 하위까지 강제로 삭제하기 (주의 : 경로를 잘못 적었다가는 모든 파일이 삭제될 수 있으므로 조심)

# shell utilities import shutil shutil.rmtree(“folder_name”)

폴더 복사하기

# 원본 폴더경로, 결과 폴더경로 shutil.copytree(“folder_name”, “copied_folder”)

폴더 이동하기 (또는 폴더명 바꾸기)

# 이동할 폴더 경로가 존재하는 경우, 해당 폴더 내부로 이동됨 shutil.move(“folder_name”, “folder1”) # 이동할 폴더경로가 존재하지 않는 경우, 폴더명이 변경되는 효과 shutil.move(“folder_name”, “new_folder_name”)

로그 쓰기

콘솔(터미널)에 로그 쓰기

import logging # 로그 포맷 설정 logging.basicConfig(level=logging.DEBUG, format=”%(asctime)s [%(levelname)s] %(message)s”) logging.debug(“디버그 메시지를 출력합니다.”) logging.info(“정보 메시지를 출력합니다.”) logging.warning(“경고 메시지를 출력합니다.”) logging.error(“오류 메시지를 출력합니다.”) logging.critical(“치명적인 오류 메시지를 출력합니다.”) # level=logging.DEBUG 인 경우 debug, info, warning, error, critical 출력 가능 # level=logging.INFO 인 경우 info, warning, error, critical 출력 가능 # level=logging.WARNING 인 경우 warning, error, critical 출력 가능 # level=logging.ERROR 인 경우 error, critical 출력 가능 # level=logging.CRITICAL 인 경우 critical 출력 가능

파일시스템에 로그 쓰기 (로그파일에 쓰기)

import logging from datetime import datetime # 콘솔(터미널) 및 파일시스템에 로그 쓰기 logger = logging.getLogger() logger.setLevel(logging.DEBUG) streamHandler = logging.StreamHandler() # “시간 [로그레벨] 메시지” 형태로 로그를 작성 logFormatter = logging.Formatter(“%(asctime)s [%(levelname)s] %(message)s”) streamHandler.setFormatter(logFormatter) logger.addHandler(streamHandler) # 파일명 설정 # filename = datetime.now().strftime(“test_%Y%m%d_%H%M%S.log”) filename = datetime.now().strftime(“test_%Y%m%d.log”) fileHandler = logging.FileHandler(filename, encoding=”utf-8″) fileHandler.setFormatter(logFormatter) logger.addHandler(fileHandler) logging.debug(“로그 시작”) logging.debug(“디버그 메시지를 출력합니다.”) logging.info(“정보 메시지를 출력합니다.”) logging.warning(“경고 메시지를 출력합니다.”) logging.error(“오류 메시지를 출력합니다.”) logging.critical(“치명적인 오류 메시지를 출력합니다.”)

참고사이트 1 : pyautogui 라이브러리 공식문서 https://pyautogui.readthedocs.io/

참고사이트 2 : 나도코딩 https://www.youtube.com/watch?v=exgO1LFl9x8&t=4285s