ABOUT ME

IT와 컴퓨터 관련 팁, 파이썬 등과 아파트 정보, 일상적인 경험 등의 생활 정보를 정리해서 올리는 개인 블로그

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

     

    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]

     

    반응형
Designed by goodthings4me.