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

파이썬 파일내용 검색 프로그램 만들기(GUI 버전)

파기차차 2022. 10. 1. 13:12
728x90
반응형
SMALL
728x90
ㅁ 개요
 
O 프로그램 소개
 - 사용자가 검색할 폴더와 키워드를 입력하면 해당 폴더내 파일내용에서 키워드가 포함된 모든 파일을 찾아주는 프로그램의 GUI버전 입니다.
 - 본 프로그램은 기본적으로 기존에 올려드린 '파이썬 GUI 파일검색 프로그램 만들기-키워드 버전 '과 유사하며 다른 내용 위주로 설명드리고 동일한 내용은 생략(이전 게시글 참조

2022.09.18 - [파이썬 실습/검색프로그램 만들기] - 파이썬 GUI 파일검색 프로그램 만들기-키워드 버전

) 하겠습니다.

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

 

 
 
O 완성된 프로그램 실행 화면
 
 
 
 - 아래에서는  'C:\Temp2' 폴더내의 모든 파일을 검색 후 키워드 '이력서'가 포함된 파일을 보여줍니다.
 - C:\Temp2\b.txt와 C:\Temp2\old\search_keyword.txt에 '이력서'라는 단어가 포함된것을 볼 수 있습니다.
 

 


 
ㅁ 세부 내용
 
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("fileContent_Search6.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)
                for (path, dir, files) in os.walk(folder):                          # 특정 경로에 존재하는 모든 하위 디렉토리를 탐색하며 원하는 파일을 찾고자 할때 os.walk 사용
                    print(path, dir, files)                                             # 여기서는 입력한 디렉토리인 C:\Temp2 아래의 하위 디렉토리까지 돌면서 파일을 찾을 수 있음

                    for filename in files:                                              # 파일들을 목록에서 하나씩 꺼내서
                        print(filename)
                        with open(path+os.sep+filename, 'r', encoding='UTF8') as f:   # 파일(C:\temp2\a.txt)을 읽기모드('r')로 한글이 열리도록(encoding='UTF8') 열고,
                            try:                                                        # 에러 발생시 예외를 처리하기 이해 try~except 구문 사용
                                if userInputKeyword in f.read():                            # 파일 내용 중 키워드(예: '이력서')가 존재하면 if문 실행
                                    print("===========================================================")
                                    print(path+os.sep+filename, " \t파일에 '", userInputKeyword, "' 단어가 포함되어 있습니다.")
                                    self.textEdit.append(str(path+os.sep+filename)+" \t파일에 '"+str(userInputKeyword)+"' 단어가 포함되어 있습니다.")
                                else:
                                    pass                                                # 파일 내용 중 키워드("예: 이력서")가 존재하지 않으면 아무것도 하지 않고 다음 단계로 넘어감
                                f.close()
                            except:                                                     # except에 pass로 지정해 주면 에러가 발생하더라도 중지되지 않고, skip하여 다음 단계로 넘어간다.
                                pass
                        time.sleep(0.01)
                    time.sleep(0.01)
                print("===========================================================")
                time.sleep(0.01)
        else:
            self.textEdit.setText("키워드와 검색할 폴더를 입력(선택)해 주세요.")

    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))
        print(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")
 
O 소스 다운로드
 - 아래 소스(*.ui, *.py)를 동일 경로에 놓고 실행하시기 바랍니다.

fileContent_Search6.py
0.01MB

 
 
O 핵심 내용
 
1.os.listdir() : 디렉토리 내 모든 파일을 리스트 해주는 함수
 
2.os.sep : OS의 폴더 경로 구분자(윈도우는 \, / 둘다 상관없음)
 
3.os.path.isfile() : 경로에 파일이 존재하면 참(True)
 
4.with open(file, 'r') as f:         : 파일(file)을 읽기('r') 모드로 열때 사용
 
5.encoding='UTF8' : 한글이 깨질때 사용
 
6.os.walk() : os.listdir()과 비슷하나, 하위디렉토리까지 돌면서 모든 파일을 리스트해주는 함수, os.listdir()함수는 자신의 첫번째 디렉토리의 모든 파일만 리스트함
 
7.for (path, dir, files) in os.walk(folder): : 특정 경로에 존재하는 모든 하위 디렉토리를 탐색하며 원하는 파일을 찾고자 할때 사용하는 표현임
 
 

 
 
O 기본 내용
 
1.아래 소스에서 기본적으로 기존에 올려드린 이전글(2022.09.18 - [파이썬 실습/검색프로그램 만들기] - 파이썬 GUI 파일검색 프로그램 만들기-키워드 버전)과 내용이 동일하며, 파일내용을 검색하는 핵심 기능만 설명드리겠습니다.

 

for (path, dir, files) in os.walk(folder): <-- 이 구문을 통하여 F:/Temp2 경로에 존재하는 모든 파일과 디렉토리를 점검합니다.

for filename in files: <-- 파일들에서 for문을 이용하여 파일 하나씩 돌면서 확인합니다.

with open(path+os.sep+filename, 'r', encoding='UTF8') as f:  <-- 파일(전체경로(path+os.sep+filename)로)을 한글(encoding='UTF8')을 포함한 읽기모드('r')로 엽니다.

if userInputKeyword in f.read(): <-- 만약 파일 내용 중에 유저가 입력한 키워드(또는 파일로 불러온 키워드)가 존재하면

self.textEdit.append(str(path+os.sep+filename)+" \t파일에 '"+str(userInputKeyword)+"' 단어가 포함되어 있습니다.") <-- 텍스트에디트(textEdit) 창에 해당 문구(F:/Temp2\나의 이력서입니다..txt         파일에 ' 개인정보 ' 단어가 포함되어 있습니다.)를 append(추가)로 붙여 넣습니다.

 

 

이하 내용은 앞서 말씀드린 '파이썬 GUI 파일검색 프로그램 만들기-키워드 버전 ' 의 내용과 동일합니다.

 
 

 
ㅁ 정리
 
O 우리가 배운 내용
 
 - 파일내용 검색 프로그램을 GUI버전으로 만들어 보았습니다.
 - 텍스트 버전과 핵심내용은 동일합니다. 또한 기본적인 내용은 앞서 만들어 본 이전글(2022.09.18 - [파이썬 실습/검색프로그램 만들기] - 파이썬 GUI 파일검색 프로그램 만들기-키워드 버전)과 동일합니다.
 - for (path, dir, files) in os.walk(folder): 와 같은 핵심적인 표현을 알아 두시면 향후 유사한 프로그램 개발시 도움이 될 것입니다.
 
 

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

 

 

감사합니다.

 

728x90
반응형
LIST