상세 컨텐츠

본문 제목

python 백업 프로그램 만들기 2 - 기능2

본문

반응형

2. 검색 날짜 조회

 : 필요한 파일을 찾아 내는 가장 핵심적인 부분이다.

 

  ① 해당 일을 입력 받고,

  ② 입력 받을 날짜를 기준에 포함하는 대상(file)을 조회하는 기능이다.

 

먼저 해당 기능을 구현하기 전 알아야 하는 내용이 2가지가 있는데,

 1. '파일에 사용되는 시간'과 2. '시간을 표현하는 방식'이다.

 

 

이게 뭐가 다른가 라고 생각할 수 있는 분들을 위해 간단한 내용으로 설명을 진행해보겠다.

 

1. 파일에 사용되는 시간

 엑셀이나 기타 파일을 우클릭 한 후, '속성' 항목을 눌러보게되면

 '만든 날짜', '수정한 날짜', '엑세스한 날짜' 가 있다.

 이 중에서 우리가 알아야 할 항목은 '만든 날짜' 와 '수정한 날짜' 이다.

  - 만든 날짜 : 해당 파일을 처음 만든 날짜

  - 수정한 날짜 : 마지막으로 파일을 저장한 날짜

 

 

예를 들어 위의 파일을 보면 해당 파일은 2021년 10월 26일 오후 7:34:40 에 해당 파일을 만들고, 

1회 이상 혹은 여러번의 수정을 거친 후, 마지막으로 저장을 한 날짜는 2022년 1월 14일 오후 7:24:24 이다.

 

그래서 누군가 이전에 작업한 파일 중 오늘 내 PC에 저장한 파일을 찾기 위해선 '만든 날짜'

내가 이전에 받은 파일 중 오늘 수정한 파일을 찾기 위해선 '수정한 날짜' 를 확인해야한다.

 

파이썬에서 아래 모듈을 통해 만든 날짜와 수정한 날짜를 확인할 수 있다.

# 파일 생성 날짜
os.path.getctime(fullname_file)
# 파일 수정 날짜
os.path.getmtime(fullname_file)

 

다만, 확인 시, 우리가 알고 있는 날짜 형식이 아닌 숫자 형식으로 나타난다.

1635244480.2476833

1642155864.1130557

 

 

우리는 읽을 수 없지만.....컴퓨터만 알고 있다. 그래서 우리가 알고 있는 형식으로 바꿀려면 time 모듈을 활용하여 

datetime 형식으로 변경할 수 있다.

 

# 파일 생성 날짜
tm_create =  time.gmtime(os.path.getctime(fullname_file))
# 파일 수정 날짜
tm_edit = time.gmtime(os.path.getmtime(fullname_file))

 

print(tm_create)

print(tm_edit)

 

time.struct_time(tm_year=2021, tm_mon=10, tm_mday=26, tm_hour=10, tm_min=34, tm_sec=40, tm_wday=1, tm_yday=299, tm_isdst=0)

time.struct_time(tm_year=2022, tm_mon=1, tm_mday=14, tm_hour=10, tm_min=24, tm_sec=24, tm_wday=4, tm_yday=14, tm_isdst=0)  

 

으로 확인할 수 있다. 다만 시간 다른 값은 모두 같으나, 시간 값이 다른 것을 확인 할 수 있다.

시간 차를 확인하기 위해선 위에서 언급한 2. '시간을 표현하는 방식'에 대한 이해가 필요하다.

 

2. 시간을 표현하는 방식(GMT)

세상의 중심은 나지만? 시간은 중심은 영국, 정확히는 영국의  그리니치 천문대이다. 이러한 시간을 표현하는 방식을 GMT(Greenwich Mean Time)라고 한다. 

https://terms.naver.com/entry.naver?docId=3477121&cid=58439&categoryId=58439 

 

GMT

기본적으로 만국 표준시와 차이가 없다. 다만 용어상의 혼동을 줄이기 위해 요즘은 ‘그리니치 평균시’ 대신 ‘만국 표준시’로 대체하는 경향이 있다.그리니치 평균시는 그리니치 천문대를

terms.naver.com

 

우리가 흔히 말하는 시차라는 개념이다.

중앙에 보이는 시차 9시간은 위에서 확인한 시간 값과 동일한 것이 눈에 띄인다.

 

 

내용이 길어져 시간 값에 대한 내용은 다음편에 ....

 

def search_target_files():
    #print(search_period_input.get())
    global diff_days
    # UI - search_period_input 미입력시 0
    
    
    
    if search_period_input.get() == '':
        diff_days = timedelta(days=int(0))  
    else:
        
        try :
            diff_days = timedelta(days=int(search_period_input.get()))  
        except:
            msb.showwarning('날짜 입력 오류', '숫자만 입력하세요.')
            return
    #print(diff_days)

    

    # scan_wait_folder 미지정시 warning 메세지 전달
    if scan_wait_folder == '':
        msb.showwarning('Scan Folder 미지정', 'Scan 경로를 설정하세요')
        return

    
    else :
        # scan 폴더 검색 / 재귀함수 이용 하위 폴더 계속 검색
        file_detail_search(scan_wait_folder)
        print(file_full_path)
        
        global target_file_list_idx
        try:
            for file in file_full_path[target_file_list_idx:]:
                target_file_list.insert(target_file_list_idx, file)
                target_file_list_idx += 1
        except:
            pass
                

        msb.showinfo('검색 완료', '해당 폴더 검색이 완료되었습니다.')
        
        

# 시간 값 이용하여 해당 파일 리스트 작성 / 재귀함수
# 파일 검색 조건 1. 확장자 / 2. 파일 생성날짜 또는 수정날짜
def file_detail_search(dir):
    files = os.listdir(dir)


    
    for file in files:
        fullname_file = os.path.join(dir,file)
        if os.path.isdir(fullname_file):
            file_detail_search(fullname_file)
        else:
            #print(fullname_file)
            #확장자 확인
            if fullname_file[-3:] == 'jpg' or  fullname_file[-3:] == 'png' or  fullname_file[-3:] == 'bmp' or  fullname_file[-3:] == 'pdf' or  fullname_file[-4:] == 'xlsx':
                          
                # 파일 생성 날짜
                tm_create =  time.gmtime(os.path.getctime(fullname_file))
                # 파일 수정 날짜
                tm_edit = time.gmtime(os.path.getmtime(fullname_file))
                
                if datetime.fromtimestamp(time.mktime(tm_edit)) + timezone_kor > today_time - diff_days or datetime.fromtimestamp(time.mktime(tm_create))  + timezone_kor > today_time - diff_days:
                    #print(today_time - diff_days)
                    #print(fullname_file)
                    #datetime 객체로 변환
                    #print(datetime.fromtimestamp(time.mktime(tm_edit))  + timezone_kor )
                    #print(datetime.fromtimestamp(time.mktime(tm_create)) + timezone_kor )

                
                    file_full_path.append(fullname_file)
반응형

관련글 더보기

댓글 영역