-4.2 C
Seoul
목요일, 2월 20, 2025

spot_img

파일 검색 및 저장 프로그램 파이썬

아래 코드는 PyQt5를 사용하여 GUI 기반의 간단한 파일 검색 및 저장 프로그램입니다. 이 프로그램은 다음과 같은 기능을 가지고 있습니다.

파일 검색 및 저장 프로그램 파이썬
파일 검색 및 저장 프로그램 파이썬
  1. 검색 폴더 선택 기능
  2. 파일 크기를 입력하여 해당 크기보다 큰 파일 검색 기능
  3. 검색된 파일 목록을 GUI 텍스트 창에 표시
  4. 검색 결과를 파일로 저장하는 기능
  5. 이 코드를 실행하면 GUI 창이 나타나며, 원하는 폴더를 선택하고 파일 크기를 입력한 후 “Search” 버튼을 클릭하여 파일을 검색할 수 있습니다. 검색 결과는 GUI 텍스트 창에 표시되며, “Save” 버튼을 클릭하여 결과를 파일로 저장할 수 있습니다.
코드 세부내역을 살펴 보겠습니다.

1. 모듈 임포트

import sys
import os
import time
from PyQt5.QtWidgets import *
from PyQt5 import uic, QtCore, QtGui, QtWidgets
  • sys: 시스템과 관련된 파이썬 모듈로, 명령행 인수 및 스크립트 종료와 같은 시스템 기능을 제공합니다.
  • os: 운영체제와 상호 작용하는 파이썬 모듈로, 파일 및 디렉터리 관리 등의 작업을 수행합니다.
  • time: 시간과 관련된 파이썬 모듈로, 시간 지연 및 측정 기능을 제공합니다.
  • PyQt5: Qt 프레임워크를 사용한 GUI 애플리케이션을 개발하기 위한 모듈입니다.
  • uic: Qt Designer를 통해 디자인한 UI 파일을 로드하는 모듈입니다.

2. UI 파일로드

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

 

uic.loadUiType("winsearch5.ui")를 통해 Qt Designer에서 디자인한 UI 파일 “winsearch5.ui”를 로드하고, 해당 UI에 대한 클래스를 가져옵니다.

3. 클래스 정의

class MyWindow(QMainWindow, form_class):

QMainWindowform_class 클래스를 상속하는 MyWindow 클래스를 정의합니다.

4. 클래스 초기화 및 UI 설정

def __init__(self):
    super().__init__()
    self.setupUi(self)
    # UI 설정 및 이벤트 핸들러 연결

MyWindow 클래스의 초기화 메서드로, UI를 초기화하고 이벤트 핸들러를 설정합니다.

5. 파일 검색 메서드

def searchFile(self):
    # 파일 검색 및 결과 표시

사용자가 입력한 폴더에서 파일을 검색하고, 결과를 GUI 텍스트 창에 표시합니다.

6. 폴더 선택 메서드

def selectFolder(self):
    # 검색할 폴더 선택

사용자에게 폴더를 선택하도록 대화상자를 열어주는 메서드입니다.

7. 폴더 선택 메서드

def saveFile(self):
    # 검색 결과를 파일로 저장

검색된 결과를 파일로 저장하는 메서드입니다.

8. 이벤트 처리 메서드

def clickMethod(self):
    # 경고 메시지 표시

9. 어플리케이션 실행

app = QApplication(sys.argv)
window = MyWindow()
window.show()
app.exec_()
  • PyQt5 애플리케이션을 초기화하고 MyWindow 클래스의 인스턴스를 생성하며, 애플리케이션 이벤트 루프를 실행합니다.

이 프로그램은 사용자로부터 폴더 및 파일 크기를 입력받아 해당 폴더에서 지정한 크기보다 큰 파일을 검색하고, 검색 결과를 GUI를 통해 표시하거나 파일로 저장하는 기능을 제공합니다. PyQt5를 사용하여 GUI를 만들고, Python의 os 모듈을 이용하여 파일 검색 및 크기 측정을 수행합니다.

10. 완성코드

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

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

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

        self.pushButton.clicked.connect(self.searchFile)
        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:/Download'

        if self.lineEdit.text():
            file_size_input = self.lineEdit.text()
            if int(file_size_input) < 1000:
                print("파일 검색 사이즈가 너무 작습니다.(1000 bytes 이상)")
                self.textEdit.setText("파일 검색 사이즈가 너무 작습니다.(1000 bytes 이상)")
                self.clickMethod()
            else:
                self.textEdit.clear()
                try:
                    for (path, dirs, files) in os.walk(folder):
                        for file in files:
                            try:
                                filename = os.path.join(path, file)
                                file_size = os.path.getsize(filename)
                                if file_size > int(file_size_input):
                                    print("파일명 : ", filename, "\t", "파일크기 : ", file_size, "\n")
                                    self.textEdit.append(str(filename) + "\t" + str(file_size) + " bytes")
                                folder_size_total += os.path.getsize(filename)
                            except FileNotFoundError:
                                pass
                        time.sleep(0.1)
                    time.sleep(0.1)
                    self.textEdit.append("\n폴더전체크기 : " + str(folder_size_total) + " bytes")

                    print(folder, "폴더전체크기 : ", folder_size_total, " Bytes")
                except KeyboardInterrupt:
                    sys.exit()

        else:
            self.textEdit.setText("파일 크기를 입력해 주세요.(1000 bytes 이상)")

    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")
  1. form_class = uic.loadUiType(“winsearch5.ui”)[0] : 유저가 만든 UI를 로드하여 form_class변수에 할당
  2. app=QApplication(sys.argv) : app객체 생성
  3. lass 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. file_size_input = self.lineEdit.text() : Qt Desiner의 lineEdit에서 입력받은 값을 file_size_input 변수에 저장
  10. self.textEdit.setText(“파일 검색 사이즈가 너무 작습니다.(1000 bytes 이상)”) : Qt Desiner의 textEdit에 경고문구 안내
  11. QMessageBox.about(self, “주의!!”, “파일 검색 사이즈가 너무 작습니다. (1000 bytes 이상)”) : 경고창 형태로 메시지 박스를 띄움
  12. for (path, dirs, files) in os.walk(folder): 검색할 폴더에서 경로명, 하위디렉토리명, 파일명을 리스트로 각 각 path, dirs, files에 저장
  13. filename = os.path.join(path, file) : 경로 + 파일명으로 filename변수에 저장
  14. file_size = os.path.getsize(filename) : 위(13번) 파일의 크기를 file_size변수에 저장
  15. self.textEdit.append(str(filename) + “\t” + str(file_size) + ” bytes”) : Qt Desiner의 textEdit에 append로 filename과 file_size를 추가해줌
  16. folder_size_total += os.path.getsize(filename) : 검색폴더의 전체 크기를 구하기 위하여 if문 밖에 getsize()함수를 이용하여 파일들의 크기를 누적으로 더해줌
  17. time.sleep(0.1) : 프로그램이 먹통되지 않도록 일정 시간 쉬게 해줌
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

Related Articles

Stay Connected

18,393FansLike
128,393FollowersFollow
81,934SubscribersSubscribe

Latest Articles