본문 바로가기
코딩 연습/코딩배우기

[Python] 파이썬 파일 시스템(디렉토리, 파일) 다루기 연습 코드 정리

by good4me 2021. 7. 6.

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')

 

good4me.co.kr

 

■ 주어진 경로의 모든 폴더와 파일 이름 가져오기

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]

 

댓글