-
[Python] 파이썬 파일 시스템(디렉토리, 파일) 다루기 연습 코드 정리코딩 연습/코딩배우기 2021. 7. 6. 21:08반응형
[출처] [나도코딩] 파이썬 코딩 무료 강의 (활용편4) - 업무자동화(RPA), 이제는 일하는 척(?)만 하세요 https://youtu.be/exgO1LFl9x8
■ 파이썬 파일시스템 (파이썬으로 파일, 폴더 다루기)
import os import datetime import time import fnmatch import shutil ## 파일 기본 print(os.getcwd()) # current working directory 현재 작업 공간 # os.chdir('directory명') # 작업 공간 이동 # os.chdir('..') # 상위(부모) 폴더로 이동 # os.chdir('../..') # 현재 기준 2단계 상위 폴더로 이동 # os.chdir('c:/') # 절대 경로로 이동 ## 파일 경로 만들기 filename = os.path.join(os.getcwd() + '\my_file.txt') # 절대경로 생성 print(filename) # 현재 경로 + my_fiel.txt ## 파일 경로에서 폴더 정보만 가져오기 path = os.path.dirname(r'D:\backup\dev\python\my_file.txt') print(path) # D:\backup\dev\python ## 파일 정보 중 파일 생성 날짜 가져오기 ctime = os.path.getctime('./image/file_menu.png') # c - create print(ctime) print(datetime.datetime.fromtimestamp(ctime)) print(datetime.datetime.fromtimestamp(ctime).strftime('%Y%m%d %H:%M:%S')) ## 파일의 수정 날짜 mtime = os.path.getmtime('./bid2.txt') # m -modify print(mtime) print(datetime.datetime.fromtimestamp(mtime)) print(datetime.datetime.fromtimestamp(mtime).strftime('%Y%m%d %H:%M:%S')) ## 파일의 마지막 접근 날짜 atime = os.path.getatime('./bid2.txt') # a -access print(atime) print(datetime.datetime.fromtimestamp(atime)) print(datetime.datetime.fromtimestamp(atime).strftime('%Y%m%d %H:%M:%S')) ## 파일 크기 filesize = os.path.getsize('beautifulsoup.py') print(filesize) # 바이트 단위로 파일 크기 가져옴 ## 파일 목록 가져오기 fileList = os.listdir() # 현재 디렉토리의 모든 폴더, 파일 목록 가져오기 print(fileList, type(fileList)) # list 타입 print(os.listdir('./image')) # 주어진 폴더의 모든 폴더와 파일 리스트 가져오기 ## 파일 목록 가져오기 (하위 폴더의 파일 모두 포함) result = os.walk('./') # 디렉토리 주어야 함 './' or '.' 는 현재 디렉토리 print(result, type(result)) # <generator object walk at 0x0000016AD78E7B30> <class 'generator'> for d in result: # (./, [], []) 형태임 - root, directory, file print(d) for root, dirs, files in result: print(f'root: {root}') for d in dirs: print(f'directory: {d}') for f in files: print(f'filename: {f}') ## 폴더 내에서 특정 파일들을 찾으려면? name = 'movie_2020_2.jpg' result = [] for root, dirs, files in os.walk('.'): if name in files: result.append(os.path.join(root, name)) print(result) ## 폴더 내에서 특정 패턴을 가진 파일들을 찾으려면? import fnmatch # *.xlsx, *.txt, 자동화*.png 등 pattern = '생생*.txt' # '*.txt' result = [] for root, dirs, files in os.walk('.'): for name in files: if fnmatch.fnmatch(name, pattern): # 파일 이름과 패턴이 일치하면 result.append(os.path.join(root, name)) print(result) ## 주어진 경로가 폴더인지, 파일인지 알아내기 print(os.path.isdir('image')) print(os.path.isfile('image')) ## 지정된 경로에 해당하는 파일 또는 폴더가 없다면? - os.path.exists() if os.path.exists('image'): print('파일 또는 폴더가 존재합니다.') else: print('존재하지 않습니다.') ## 파일 만들기 open('new_file.txt', 'a').close() # 빈 파일 생성 ## 파일명 변경 os.rename('new_file.txt', 'new_file_rename.txt') ## 파일 삭제하기 os.remove('new_file_rename.txt') ## 폴더 만들기 os.mkdir('new_folder') # 현재 경로 기준으로 폴더 생성 os.mkdir('d:/users/test') # 절대 경로 기준으로 폴더 생성 # os.mkdir('new_folder/a/b') # 에러 발생 - 이렇게 사용 불가 os.makedirs('new_folders/a/b') # 하위 폴더까지 생성 ## 폴더 지우기 - 하위 폴더까지 지우려면 import shutil - shell utilities os.rmdir('new_folder') os.rmdir('new_folders') # OSError: [WinError 145] 디렉터리가 비어 있지 않습니다: shutil.rmtree('new_folders') # 폴더 안이 비어 있지 않아도 완전 삭제 가능 (사용 주의!!) ## 파일 복사하기 os.mkdir('test_folder') shutil.copy('random.py', 'test_folder') print(os.listdir('./test_folder')) shutil.copy('random.py', 'test_folder/random_new.py') shutil.copyfile('random.py', 'test_folder/random_rename.py') # 대상 경로와 파일명 필수 shutil.copy2('random.py', 'test_folder/random2.py') # copy, copyfile은 메타정보 복사(X), copy2는 메타정보 복사(O) ## 폴더 복사 shutil.copytree('test_folder', 'test_folder2') # 원본 폴더 경로, 대상 폴더 경로 ## 폴더 이동 shutil.move('test_folder', 'test_folder2')■ 주어진 경로의 모든 폴더와 파일 이름 가져오기
def files(fp): for dirpath, dirnames, filenames in os.walk(fp): print(f'\n{dirpath}') for file in filenames: print(file) if cnt := len(dirnames): for i in range(cnt): files(dirnames[i]) # 재귀 호출 files(r'D:\test')■ 메타정보 없이 파일만 다른 폴더에 복사
source_path = r'D:\test' target_path = r'D:\test2' # 방법 1 for file in os.listdir(source_path): if os.path.isfile(file): shutil.copy(file, target_path) # 방법 2 for file in [f for f in os.listdir(source_path) if os.path.isfile(f)]: shutil.copy(file, target_path)■ 특정 폴더에 있는 파일 리스트를 가져와서 엑셀로 저장하기
import os from datetime import datetime import pandas as pd def file_list(source_path, target_path): fileName = [] filePath = [] fileSize = [] fileCreateDate = [] fileModifyDate = [] for dirpath, dirnames, filenames in os.walk(source_path): for file in filenames: fileName.append(file) filePath.append(dirpath) fileSize.append(os.stat(dirpath + '/' + file).st_size) # 파일 크기 # os.stat()의 속성으로 파일 생성 및 수정 일시 알아보기, 시간 포맷 변경 print(os.stat(dirpath + '/' + file)) # ----------------------------------------------------------- # os.stat_result(st_mode=33206, # st_ino=9007199254749934, # st_dev=1725487634, # st_nlink=1, # st_uid=0, # st_gid=0, # st_size=15139, # st_atime=1625577614, # st_mtime=1605448050, # st_ctime=1625577614) # ----------------------------------------------------------- ctime = os.stat(dirpath + '/' + file).st_ctime # 파일 생성 일시 stctime = datetime.fromtimestamp(ctime).strftime('%Y-%m-%d %H:%M:%S') fileCreateDate.append(stctime) mtime = os.stat(dirpath + '/' + file).st_mtime # 파일 수정일시 stmtime = datetime.fromtimestamp(mtime).strftime('%Y-%m-%d %H:%M:%S') fileModifyDate.append(stmtime) file_dict = {'Name':fileName, 'FolderPath':filePath, 'Size':fileSize, 'DateCreated':fileCreateDate, 'DateModified':fileModifyDate} df = pd.DataFrame(file_dict) df.to_excel(r'D:\test2' + '\FileList.xlsx') source_path = r'D:\test' target_path = r'D:\test2' file_list(source_path, target_path) [참고 : https://www.youtube.com/watch?v=epIaTx6l1mI]반응형'코딩 연습 > 코딩배우기' 카테고리의 다른 글
