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

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

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

ㅁ 개요

 

O 프로그램 소개

 

 

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

 

 

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

 

 

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

 

 

1. 프로그램 실행 후

 

 

 

2.압축해제를 위해 이미 압축되어 있는 파일을 선택하여 불러옵니다.(아래에서는 '12.zip' 파일 선택)

 

 

 

 

3. 그리고 나서 '압축 풀기' 버튼을 클릭하면 '실행 결과' 화면에 압축해제 결과를 보여주고, 실제 폴더 확인 시 '1.txt'와 '2.txt' 파일 2개로 압축이 정상적으로 해제된 것을 볼 수 있습니다.

 

 


 

ㅁ 세부 내용

 

O 완성된 소스

 

 

소스 : 2.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("compressUncompress.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)

        self.pushButton_3.clicked.connect(self.startUncompress)
        self.toolButton_3.clicked.connect(self.selectFile)

    def startUncompress(self):
        dir = os.path.dirname(file[0])
        os.chdir(dir)

        if self.lineEdit_4.text():
            uncomFileName = self.lineEdit_4.text()
            try:
                pass
                with zipfile.ZipFile(uncomFileName, 'r') as existing_zip:
                    existing_zip.extractall('.')
                self.textEdit.setText("선택하신 압축 파일 ("+str(uncomFileName)+") 이 정상적으로 해당 폴더 (현재폴더) 에 압축 해제 되었습니다.")
            except:
                pass
                self.textEdit.setText("압축 해제과정에서 에러가 발생하였습니다.")
        else:
            self.textEdit.setText("압축 해제할 파일을 선택하지 않았습니다.")

    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:
                    pass
                    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:
                    pass
                    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]))

    def selectFile(self):
        global file
        file = QtWidgets.QFileDialog.getOpenFileName()
        self.lineEdit_4.setText('{}'.format(file[0]))

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

 

 

 

 

 

O 소스 다운로드 및 실행

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

 

 


 
 

O 주요 내용

 

1. 초기화 함수 아래에 아래 2줄을 추가하였습니다.

pushButton_3 클릭시 startUncompress함수가, toolButton_3 클릭시 selectFile함수가 실행되도록 하고 있습니다.

 

self.pushButton_3.clicked.connect(self.startUncompress)
self.toolButton_3.clicked.connect(self.selectFile)

 

 

 

2. 압축 해제시는 여러파일을 선택할 필요가 없으므로 아래와 같이 getOpenFileName()함수를 사용하여 파일을 선택해 줍니다.

file = QtWidgets.QFileDialog.getOpenFileName()

 

 

3. 압축 해제시 코드도 압축시 코드와 유사하며, 주요하게 다른 점은 다음과 같습니다.

with zipfile.ZipFile(uncomFileName, 'r') as existing_zip: # 압축해제할 파일을 읽기모드('r')로 열어서
         existing_zip.extractall('.') # 현재 디렉토리에 모두 압축을 해제 합니다.

 

 

 

 


 

ㅁ 정리

 

O 우리가 배운 내용

 
 - 오늘 우리는 압축된 파일을 푸는 방법에 대하여 알아보았습니다.
 
 
 
 - 오늘 우리가 배운 내용을 두줄로 정리해 보면 아래와 같습니다.
 
 
 > 1.압축해제시 하나의 파일(압축된 파일)만 선택하면 되므로 getOpenFileName()함수를 사용합니다.
file = QtWidgets.QFileDialog.getOpenFileName()
 
 > 2.압축 해제시 사용하는 구문은 아래와 표현합니다.
with zipfile.ZipFile(uncomFileName, 'r') as existing_zip:
          existing_zip.extractall('.')
 

 

이것으로, '파이썬 GUI 파일압축 및 해제 프로그램 만들기'를 마칩니다.

긴글 읽어주셔서 감사하고, 댓글하트는 제가 이글을 지속할 수 있게 해주는 힘이 됩니다.

 

 

감사합니다.

 

 

 

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

 

728x90
반응형
LIST