파이썬 실습/GUI 파일압축 및 해제 프로그램 만들기

파이썬 GUI 파일압축 및 해제 프로그램 만들기 - 2. 파일 압축하기

파기차차 2023. 2. 13. 07:25
728x90
반응형
SMALL
728x90
반응형

ㅁ 개요

 

O 프로그램 소개

 

 

 - 이번 글은 이전글(파이썬 GUI 파일압축 및 해제 프로그램 만들기 - 1. 소개)에 이은 2번째 글로 파일을 압축하는 방법에 대하여 알아보겠습니다.

 

 

O 완성된 프로그램 실행 화면

 

 

 - 최종 완성된 프로그램의 결과화면은 아래와 같습니다.

 

 

1. 프로그램을 실행하면

 

2.아래와 같은 윈도우(GUI) 화면이 나타나는데, 여기서 '...' 클릭하여 압축할 파일('3.txt')을 선택 후 '열기' 버튼을 클릭하면

선택한 파일이 '압축할 파일 선택' 부분에 나타납니다.

 

 

3. 그리고 나서 '압축할 파일명'을 입력('3.zip') 후 '압축시작' 버튼을 클릭하면 '실행결과'에 결과 내용이 보여지고, 실제 폴더 확인결과 '3.zip'으로 잘 압축된 것을 확인 할 수 있습니다.

 

 

 

 

 

 

 

 

 


 

ㅁ 세부 내용

 

O 완성된 소스

 

 

소스 : 1.py( 파일 압축하기)

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

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

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

        self.setFixedSize(800,600)
        self.setWindowIcon(QIcon("pagichacha.png"))
        self.setupUi(self)

        self.pushButton.clicked.connect(self.startCompress)
        self.toolButton.clicked.connect(self.selectFiles)

    def startCompress(self):
        if len(files[0]) == 1:
            files2 = files[0][0]
            file = os.path.basename(files2)
            dir = os.path.dirname(files2)
            os.chdir(dir)

            if self.lineEdit.text() and self.lineEdit_2.text():
                comFileName = self.lineEdit.text()
                try:
                    new_zip = zipfile.ZipFile(comFileName, 'w')
                    new_zip.write(file, compress_type=zipfile.ZIP_DEFLATED)
                    self.textEdit.setText("선택하신 파일 ("+file+") 이 정상적으로 해당 폴더 ("+dir+") 에 압축("+comFileName+")되었습니다.")
                    new_zip.close()
                except:
                    self.textEdit.setText("압축 실행과정에서 에러가 발생하였습니다.")
            else:
                self.textEdit.setText("압축할 파일을 선택하지 않았거나, 압축할 파일명을 입력하지 않았습니다.")
        else:
            myfiles = []

            for file in files[0]:
                myfiles.append(os.path.basename(file))
            files2 = files[0][0]

            dir = os.path.dirname(files2)
            os.chdir(dir)

            if self.lineEdit.text() and self.lineEdit_2.text():
                comFileName = self.lineEdit.text()
                try:
                    with zipfile.ZipFile(comFileName, 'w') as my_zip:
                        for file in myfiles:
                            my_zip.write(file)
                        my_zip.close()
                    self.textEdit.setText("선택하신 파일 ("+str(myfiles)+") 이 정상적으로 해당 폴더 ("+dir+") 에 압축("+comFileName+")되었습니다.")
                except:
                    self.textEdit.setText("압축 실행과정에서 에러가 발생하였습니다.")
            else:
                self.textEdit.setText("압축할 파일을 선택하지 않았거나, 압축할 파일명을 입력하지 않았습니다.")

    def selectFiles(self):
        global files
        files = QtWidgets.QFileDialog.getOpenFileNames()
        self.lineEdit_2.setText('{}'.format(files[0]))

app=QApplication(sys.argv)
window = MyWindow()
window.show()
app.exec_()

 

 

 

 

 

O 소스 다운로드 및 실행

 
 - 소스파일 다운로드 후 cmd, 파워쉘 또는 vscode 등에서 아래와 같이 실행하시기 바랍니다.
 
 > python 1.py

 

 


 
 

O 주요 내용

관련된 소스를 살펴보겠습니다.

 

1.GUI 창을 띄우기 위해 관련 모듈을 임포트하고  미리 만들어둔 UI를 로드하기 위하여 form_class변수에 할당 후 초기화 함수를 만들어 줍니다.

 

※ GUI 창 띄우기 관련 자세한 설명은 아래 링크를 참고 부탁드립니다.

https://pagichacha.tistory.com/10

 

 

 

2. 만들어둔 UI를 사용하기 위해서 초기화 함수 내에서 'self.setupUi(self)' 표현을 사용하여 UI를 사용할 수 있도록 해줍니다.

그리고 pushButton 클릭 이벤트 발생시 startCompress()함수가, toolButton 클릭 이벤트 발생시 selectFiles()함수가 호출되도록 하였습니다.

 

 

3. 위에서 말씀드린 바와 같이 '...' 버튼(toolButton)을 클릭하면 selectFiles()함수가 호출됩니다.

우선 'global files'로 선언하여 'files' 변수를 외부(함수 등)에서 사용할 수 있게 해주고,

압축 시 파일을 여러개 선택할 수 있도록 getOpenFilenames() 함수를 사용하였습니다.

 

 

 

4. 압축 시 파일을 선택할 때 아래에서는 1개를 선택할 때와 2개 이상을 선택 할때로 나누어 압축을 진행하였습니다.(사실 아래의 else 구분 이하 1개로만 해도 됩니다.)

 

아래와 같이 파일명과 전체경로로 나누어주는 이유는 이렇게 하지 않고 압축 시 압축파일 속에 전체경로가 압축되어 우리가 원하는 형태의 압축이 되지않기 때문입니다.

file = os.path.basename(files2) <-- 파일명
dir = os.path.dirname(files2) <-- 전체경로

 

 

라인 43~44 : 여러 파일을 선택 한 경우 해당 파일이름만 뽑아내기 위해서 for문을 이용하여 myfiles[] 리스트에 담아둡니다.

라인 54~55 : 그리고 실제 압축 시 다시 for문으로 myfiles에서 하나식 zip으로 쓰기(myzip.write) 합니다.

 

 

 

 

 


 

ㅁ 정리

 

O 우리가 배운 내용

 
 - 오늘 우리는 원하는 파일을 선택 후 파일을 압축하는 방법에 대하여 알아보았습니다.
 
 
 
 - 오늘 우리가 배운 내용을 두줄로 정리해 보면 아래와 같습니다.
 
 
 > 1.파일 압축 시 파일명만 압축하기 위해서 다음과 같이 코딩합니다.
file = os.path.basename(files2) # 파일명만 뽑아냄
dir = os.path.dirname(files2) # 전체경로
 
 > 2.파일 압축 시 아래와 같이 코딩합니다.
new_zip = zipfile.ZipFile(comFileName, 'w')
new_zip.write(file, compress_type=zipfile.ZIP_DEFLATED)
new_zip.close()

 

오늘은 여기까지이며, 댓글하트는 제가 이글을 지속할 수 있게 해주는 힘이 됩니다.

 

 

감사합니다.

 

 

 

※ 추가적인 정보는 아래 유튜브 영상에서 해당 내용을 더욱 자세히 보실 수 있습니다.

 

728x90
반응형
LIST