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

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

파기차차 2022. 9. 18. 14:36
728x90
반응형
SMALL
728x90
ㅁ 개요
 
O 프로그램 소개
 

 - 이번 파일검색 프로그램은 파일키워드 및 검색폴더를 지정후 검색 버튼을 누르면 해당 검색폴더내에서 파일키워드를 포함하는 파일들을 모두 찾아주는 프로그램으로 결과를 저장하는 기능까지 구현한 프로그램입니다.

(본 블로그의 내용은 유튜브 동영상(파이썬 파일 GUI검색 프로그램 만들기(키워드 버전))에서 더욱 자세히 보실 수 있습니다.)

 

 

O 완성된 프로그램 실행 화면
 
 - 아래에서는  'F:/Temp2' 폴더내에서 파일명에 '이력서'가 포함된 파일을 찾아 검색 결과를 보여줍니다.
 - 검색결과는 원하는 위치에 파일저장 버튼을 클릭하여 저장할 수 있습니다.
 

 

 


ㅁ 세부 내용
 
O 완성된 소스

 

 
 
 
# -*- coding: utf-8 -*-
from fileinput import filename
import sys
import glob
from PyQt5.QtWidgets import *
from PyQt5 import uic, QtCore, QtGui, QtWidgets
import os
import time
from PyQt5.QtGui import *

form_class = uic.loadUiType("keyword_Search5.ui")[0]

class MyWindow(QMainWindow, form_class):
    def __init__(self):
        super().__init__()

        self.setFixedSize(570,582)
        self.setWindowIcon(QIcon("pagichacha.png"))
        self.setupUi(self)

        self.pushButton.clicked.connect(self.searchFile)
        self.toolButton_3.clicked.connect(self.keywordSelectFile)
        self.toolButton.clicked.connect(self.selectFolder)
        self.toolButton_2.clicked.connect(self.selectSaveFile)
        self.pushButton_2.clicked.connect(self.saveFile)
        

    def searchFile(self):
        global folder_size_total

        folder_size_total = 0

        if self.lineEdit_2.text():
            folder = self.lineEdit_2.text()
        else:
            folder = 'F:/Temp2'

        if self.lineEdit.text():
            userInputKeywords = self.lineEdit.text()
            userInputKeywords = userInputKeywords.strip()

            newuserInputKeywords = userInputKeywords.split(';')
            print(newuserInputKeywords)

            self.textEdit.clear()

            for userInputKeyword in newuserInputKeywords:
                print(userInputKeyword)
                userInputKeyword = userInputKeyword.strip()
                print(userInputKeyword)

                for filename in glob.glob(folder+'\\**/*'+userInputKeyword+'*', recursive=True):
                    print(filename)
                    self.textEdit.append(str(filename))
                    time.sleep(0.01)
        else:
            self.textEdit.setText("찾을 키워드를 입력해 주세요.(1000 bytes 이상)")

    def keywordSelectFile(self):
        file = QtWidgets.QFileDialog.getOpenFileName(self, 'Open file', './')
        print(file[0], "test")

        with open(file[0], encoding='utf-8') as f:
            keywords = f.read()
            print(keywords)
        
        self.lineEdit.setText('{}'.format(keywords))

    def selectFolder(self):
        directory = str(QtWidgets.QFileDialog.getExistingDirectory())
        self.lineEdit_2.setText('{}'.format(directory))

    def selectSaveFile(self):
        savefilename = QFileDialog.getSaveFileName(self, "Save File")
        print(type(savefilename))
        self.lineEdit_3.setText('{}'.format(savefilename[0]))

    def saveFile(self):
        savefilename = self.lineEdit_3.text()
        readfile = self.textEdit.toPlainText()
        if savefilename and readfile:
            print(type(savefilename))
            try:
                with open(savefilename, 'w+', encoding='utf8') as out:
                    out.write(readfile + "\n")
                out.close()
                self.clickMethod2()
                self.lineEdit_3.setText("")
            except:
                print("파일이 저장되지 않고, 에러가 발생하였습니다.")
        else:
            QMessageBox.about(self, "경고!!", "검색 결과가 없거나, 저정할 파일을 지정하지 않았습니다.")

    # def clickMethod(self):
    #     QMessageBox.about(self, "주의!!", "파일 검색 사이즈가 너무 작습니다. (1000 bytes 이상)")

    def clickMethod2(self):
        QMessageBox.about(self, "파일저장!!", "파일이 저장되었습니다.")

app=QApplication(sys.argv)
window = MyWindow()
window.show()
print("Before event loop")
app.exec_()
print("After event loop")
 
>위의 완성된 UI프로그램은 실행파일과 동일한 폴더에 위치시킨 후 실행하시면 됩니다. 다만, 실행 시 소스 내의 디렉토리 경로는 실제 자신의 존재하는 경로로 변경해 주셔야 합니다.
 
 
O 핵심 내용
 

1. form_class = uic.loadUiType("winsearch5.ui")[0] : 유저가 만든 UI를 로드하여 form_class변수에 할당

2. app=QApplication(sys.argv) : app객체 생성

3. class MyWindow(QMainWindow, form_class): QMainWindow 모듈은 PyQt5.QtWidgets 패키지에서 가져옴

4. window = MyWindow() : 생성자의 self는 window를 전달받음, 여기서 self는 MyWindow 클래스 그 자신을 의미

5. widow.show() : 창을 한번만 띄움

6. app.exec_() : app객체를 실행, exec_()함수의 내장 루프로 계속 창이 뜨게 만듦

7. self.setupUi(self) : form_class를 UI로 사용하겠다라는 의미

8. self.pushButton.clicked.connect(self.searchFile) : pushButton클릭시 searchFile함수 호출(먼저 Qt Desiner로 PushButton을 UI작업 후 코딩해야 에러가 없음)

9. userInputKeywords = userInputKeywords.strip() : 양쪽 문자열의 공백 제거

10. self.textEdit.clear() : 텍스트에디트 창의 내용을 지움

11. for filename in glob.glob(folder+'\\**/*'+userInputKeyword+'*', recursive=True):   : 유저가 입력한 키워드가 포함된 파일을 리컬시브하게(즉, 서브디렉토리 포함하여 모두 찾기) 찾아서

12. self.textEdit.append(str(filename)) : 해당 파일을 텍스트에디트에 append해줌

13. file = QtWidgets.QFileDialog.getOpenFileName(self, 'Open file', './') : 키워드가 포함된 파일을 선택시 ' QtWidgets.QFileDialog.getOpenFileName'와 같이 사용

14. directory = str(QtWidgets.QFileDialog.getExistingDirectory()) : 폴더 선택 시 'QtWidgets.QFileDialog.getExistingDirectory()'와 같이 사용

15. savefilename = QFileDialog.getSaveFileName(self, "Save File") : 파일 저장시 'QFileDialog.getSaveFileName'와 같이 표현

16. with open(savefilename, 'w+', encoding='utf8') as out: : 파일을 쓰기 모드로 열어서

17. out.write(readfile + "\n") : readfile(텍스트 에디트의 내용)의 내용을 저장

18. QMessageBox.about(self, "파일저장!!", "파일이 저장되었습니다. ") : 경고창 형태로 메시지 박스를 띄움

 

 


O 기본 내용

-app객체를 생성 후 MyWindow클래스를 window에 할당하고, 윈도우를 띄운 후(window.show()) 지속적으로 실행(app.exec_())하게 만듦(즉 GUI 창을 띄움)

 

 

-입력된 키워드의 공백을 제거하고, 여러개의 키워드가 입력된 경우 구분자(;)로 구분 후 glob.glob()함수로 하위폴더까지 파일이름에 키워드가 포함된 파일을 모두 찾아서 검색결과(텍스트 에디트)에 보여준다.

 

 

-키워드 검색시 직접 입력창에 입력해도 되고, 툴버튼(...)을 눌러 키워드가 포함된 파일을 불러와도 된다.

(아래에서는 'keyword.txt'파일에 '이력서;휴대전화번호;프로필'가 포함됨)

 

 

-위에서 ... 버튼으로 키워드 파일을 불러오면 아래 화면과 같이 키워드 입력창에 '이력서;휴대전화번호;프로필'이 출력됨

 

-검색폴더의 경우에도 마찬가지로 직접입력해줘도 되고, 툴버튼(...)을 눌러 폴더를 지정해도 된다.

(아래의 경우 F:\Temp2 폴더를 지정함)

 

-마지막으로 검색 결과를 저장 할 수 있으며, 저장할 파일(전체경로 포함)을 툴버튼으로 선택하거나 직접 입력할 수 있다.

 

-아래 화면은 save5.txt파일에 검색결과를 저장한 화면이다.

 


ㅁ 정리
 
O 우리가 배운 내용
 
 - GUI환경에서 키워드로 검색할 수 있도록 다양한 기능들을 살펴보았습니다.
 - 이를 응용하여 파일내용 검색 등을 구현하는데 도움을 받을 수 있습니다.
- 오늘 내용 중 가장 중요한 내용을 꼽으라면 'for filename in glob.glob(folder+'\\**/*'+userInputKeyword+'*', recursive=True): '의 표현식입니다. 이는 키워드로 파일 등을 찾을때 자주 사용되는 표현이므로 알아두시면 좋습니다.
 

 

위의 내용이 유익하셨다면, 좋아요와 구독 부탁드립니다.

 

 

감사합니다.

728x90
반응형
LIST