# -*- 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))
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초간 프로그램 실행을 멈춤
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 문장을 활용하여 소스를 수정합니다.
'파이썬 실습 > 검색프로그램 만들기' 카테고리의 다른 글
파이썬 파일내용 검색 프로그램 만들기(GUI 버전) (2) | 2022.10.01 |
---|---|
파이썬 GUI 파일검색 프로그램 만들기-키워드 버전 (0) | 2022.09.18 |
파이썬 파일내용 검색 프로그램 만들기 (2) | 2022.08.20 |
파이썬 GUI 파일검색 프로그램 만들기-파일크기 버전 (0) | 2022.08.17 |