goodthings4me.tistory.com
[출처] [나도코딩] 파이썬 코딩 무료 강의 (활용편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]
댓글