[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