파이썬 실습/검색프로그램 만들기

파이썬 파일검색프로그램 만들기(키워드 버전 )

파기차차 2022. 8. 31. 23:10
728x90
반응형
SMALL
728x90
ㅁ 개요
 
O 프로그램 소개
 
 - 사용자가 검색할 폴더를 입력 후 실행하면 입력한 폴더내에서 미리 저장해둔 키워드가 포함된 모든 파일을 찾아주는 프로그램 입니다.(텍스버전으로 GUI버전은 추후 게시예정)
(본 블로그의 내용은 유튜브 동영상(파이썬 파일 검색 프로그램 만들기)에서 더욱 자세히 보실 수 있습니다.)
 
 
O 완성된 프로그램 실행 화면
 
 - 아래에서는  'F:\Temp2' 폴더내의 모든 파일을 검색 후 파일이름에 키워드 '이력서' 및 '휴대전화'가 포함된 파일을 보여줍니다.
 - 'C:\Temp\search_keyword.txt'  파일은 미리 만들어 두셔야 하며, 찾고자하는 키워드(아래에서는 '이력서'와 '휴대전화')를 입력해 두셔야 합니다.
- 아래의 경우 >'python imsi4.py F:\Temp2 F:\Temp2' 실행 결과 이력서와 휴대전화가 포함된 모든 파일을 찾아주고 있는 것을 볼 수 있습니다.

 


 
ㅁ 세부 내용
 
O 완성된 소스
 
# -*- coding utf-8 -*-
import os
import glob
import time
import sys
from traceback import format_tb

search_keyword = 'C:/Temp/search_keyword.txt'                       # 키워드가 저장된 키워드 파일 경로 변수 설정
for_break = True                                                    # 무한 루프를 빠져나오기 위해 for_break 변수를 True로 설정
j = 1                                                               # 차수를 표시하기 위한 변수

while len(sys.argv) > 1:                                            # 프로그램 인자가 적어도 1개 이상 있어야 실행, 계속해서 점검할 수 있도록 while루프를 사용
    # print(len(sys.argv))
    try:
        if os.path.isfile(search_keyword):                          # 만일 for_break 변수가 False이면 while루프를 빠져나옴
            if for_break == False:
                break

            
            print("############################ %d회차 점검 시작############################" % (j))
            for i in range(1, len(sys.argv)):                       # 1부터 프로그램 인자 개수만큼 실행(즉, 디렉토리별로 모두 점검)
                print("########################################################################")
                print("%d번째 점검 디렉토리 : \t'%s'" % (i, sys.argv[i]))
                txtf = open(search_keyword, 'r', encoding='utf8')   # search_keyword파일을 읽기 모드로 읽어서(encoding='utf8'이 안되는 경우 encoding='euckr' 사용)
                data = txtf.read()                              # data변수에 저장

                if data:                                        # data에 키워드가 있으면 실행
                    with open('C:/Temp/search_keyword.txt', encoding='utf8') as f:
                        print("########################################################################")
                        for content in f:
                            content = ''.join(content.splitlines()) # 리스트를 문자열로 변환
                            # 경로상(argv[2]의 파일이름 중에 키워드(content)가 존재하는지 해당 경로를 모두 점검(recursive=True)하여 filename변수에 삽입 )
                            for filename in glob.glob(sys.argv[i]+'\\**/*'+content+'*', recursive=True):
                                print(filename)
                else:
                    print(search_keyword, "파일내 키워드가 존재하지 않습니다.")
                    for_break = False                           # 파일내 키워드가 존재하지 않으면 (상위 while루프도 빠져나기위해 설정)
                    break                                       # for루프를 빠져나감

                time.sleep(1.5)                                 #1.5초 쉰 뒤 다시 프로그램 시작

            time.sleep(3)

            j = j + 1
            print("\n\n\n")
        else:
            print(search_keyword+"파일이 존재하지 않습니다.")
            for_break = False
            break

        
    except KeyboardInterrupt:                                    # Ctrl+C 입력시 프로그램 빠져나옴
        sys.exit()

else:
    print("키워드를 검색할 디렉토리를 지정해 주시기 바랍니다.")     # 디렉토리 미지정시 안내 문구 실행

print(len(sys.argv))

 

 
O 핵심 내용
 

1. len(sys.argv) : 프로그램 인자의 갯수, 예시) python imsi.py F:\Temp2 <-- 이렇게 하는 경우 python 뒤의 인자의 갯수는 2개임

2. os.path.isfile() : 경로에 파일이 존재하면 참(True)

3. for_break == False : 이중루프를 빠져나오기 위해 임의로 만든 변수

4. open(search_keyword, 'r', encoding='utf8') : search_keyword파일을 읽기모드로 연다(한글을 열기 위해  encoding='utf8'를 사용하였으며, 혹시라도 인코딩 에러 발생시 encoding='euckr'을 사용한다.

5. content.splitlines() : content를 리스트 형태로 반환, 예) ['이력서']

6. ''.join(content.splitlines()) : 위의 리스트 형태를 .join으로 다시 문자열로 변환

7. glob.glob(sys.argv[i]+'\\**/*'+content+'*', recursive=True) : 지정한 폴더 내 모든 파일(하위 폴더 포함, recursive)을 검색하여 content(이력서, 휴대전화)가 포함된 파일을 찾아줌 <-- 가장 중요

8. time.sleep(1.5) : 1.5초간 프로그램 실행을 멈춤

 

 

 


 

 
O 기본 내용
 
1. search_keyword파일에 키워드(이력서, 휴대전화)를 미리 저장해 둔다.
2. glob.glob(~~, recursive)를 이용하여 하위폴더까지 찾도록 소스를 작성한다.
3. >python imsi.py F:\Temp2 실행 결과 키워드 파일에 포함된 '이력서', '휴대전화' 가 포함된 F:\
Temp2의 2개 파일('나의 이력서입니다.txt', '나의 휴대전화번호입니다.txt')을 찾은 것을 볼 수 있다.

 

 

1. while문을 사용하여 프로그램이 계속 실행되도록 수정하였습니다.

2. search_keyword 파일내 키워드가 존재하지 않는 경우 상위 while문에 의해 무한 루프에 빠지지 않도록 for_break를 False로 만들고 break로 for문을 빠져나오면 while문에서 다시 if for_break == False: 조건을 만족하여 break로 while문도 빠져나오게 됩니다.

3.위의 실행결과와 동일하나 time.sleep()에 의해 for문이 끝나면 잠시 쉽니다.

 

 

3. 프로그램 실행 차수(회차)를 표시할 수 있게하여 보기 좋게 만들었습니다. 차수 표시는 j = j + 1로 만들어 줍니다.

 

4. while문에 의해 프로그램이 계속 실행되므로, 중지하려면 Ctrl+C를 눌러야 합니다. 다만, 이 경우 보기에 좋지 않은 에러 메시지가 나오므로 Ctrl+C를 눌러도 에러가 나지 않도록 try~except keyboardInterrupt 문장을 활용하여 소스를 수정합니다.

 

 


 

 

ㅁ 정리
 
O 우리가 배운 내용
 
 - 특정 폴더의 파일을 찾을 수 있도록 파일 검색 프로그램을 만들어 보면서 다양한 함수의 사용법을 익혔습니다.
 - 이로써 우리는 나중에 더 큰 프로그램 작성시 이를 기반으로 활용할 수 있는 토대를 닦았습니다.
- 파일 등을 찾을때 glob.glob()는 자주 사용되는 표현이므로 외울 필요까지는 없으나, 알아두시면 좋습니다.
 
 
O 숙제
 
 - 위 소스를 기반으로 윈도우에서 파일을 검색하는 프로그램을 만들어 보면 실력을 키우는데 많은 도움이 될 것으로 확신합니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
LIST