ㅁ 개요
O 프로그램 소개
- 이번 글은 이전글(파이썬 GUI 파일압축 및 해제 프로그램 만들기 - 1. 소개)에 이은 2번째 글로 파일을 압축하는 방법에 대하여 알아보겠습니다.
O 완성된 프로그램 실행 화면
1. 프로그램을 실행하면
![](https://blog.kakaocdn.net/dn/bziiH4/btrXqCVhoyB/ElE3SCQjtnUwZZfBkyscsk/img.png)
2.아래와 같은 윈도우(GUI) 화면이 나타나는데, 여기서 '...' 클릭하여 압축할 파일('3.txt')을 선택 후 '열기' 버튼을 클릭하면
선택한 파일이 '압축할 파일 선택' 부분에 나타납니다.
![](https://blog.kakaocdn.net/dn/dj7h3o/btrXoC2xrG0/NFwL0yUSzaDmBYGVRsov30/img.png)
3. 그리고 나서 '압축할 파일명'을 입력('3.zip') 후 '압축시작' 버튼을 클릭하면 '실행결과'에 결과 내용이 보여지고, 실제 폴더 확인결과 '3.zip'으로 잘 압축된 것을 확인 할 수 있습니다.
![](https://blog.kakaocdn.net/dn/booMOy/btrXqD0XTmQ/Tg3HxWWuT88Zl0XMfLnRM0/img.png)
ㅁ 세부 내용
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 소스 다운로드 및 실행
O 주요 내용
관련된 소스를 살펴보겠습니다.
1.GUI 창을 띄우기 위해 관련 모듈을 임포트하고 미리 만들어둔 UI를 로드하기 위하여 form_class변수에 할당 후 초기화 함수를 만들어 줍니다.
※ GUI 창 띄우기 관련 자세한 설명은 아래 링크를 참고 부탁드립니다.
https://pagichacha.tistory.com/10
![](https://blog.kakaocdn.net/dn/ce9T1u/btrXnJuklH9/dOckVQW0JRRqYI6moGWz8k/img.png)
2. 만들어둔 UI를 사용하기 위해서 초기화 함수 내에서 'self.setupUi(self)' 표현을 사용하여 UI를 사용할 수 있도록 해줍니다.
그리고 pushButton 클릭 이벤트 발생시 startCompress()함수가, toolButton 클릭 이벤트 발생시 selectFiles()함수가 호출되도록 하였습니다.
![](https://blog.kakaocdn.net/dn/sQL39/btrXnvb0OXM/p0sfSahZxSbwbBeUw5u3G0/img.png)
3. 위에서 말씀드린 바와 같이 '...' 버튼(toolButton)을 클릭하면 selectFiles()함수가 호출됩니다.
우선 'global files'로 선언하여 'files' 변수를 외부(함수 등)에서 사용할 수 있게 해주고,
압축 시 파일을 여러개 선택할 수 있도록 getOpenFilenames() 함수를 사용하였습니다.
![](https://blog.kakaocdn.net/dn/dydYax/btrXn8U0M1X/Y7zVfhMSAoyoqKZrFEk0Y1/img.png)
![](https://blog.kakaocdn.net/dn/3bqJK/btrXnuRHKMV/TSb3XZvKlNSGi9QpiVHWpK/img.png)
4. 압축 시 파일을 선택할 때 아래에서는 1개를 선택할 때와 2개 이상을 선택 할때로 나누어 압축을 진행하였습니다.(사실 아래의 else 구분 이하 1개로만 해도 됩니다.)
아래와 같이 파일명과 전체경로로 나누어주는 이유는 이렇게 하지 않고 압축 시 압축파일 속에 전체경로가 압축되어 우리가 원하는 형태의 압축이 되지않기 때문입니다.
file = os.path.basename(files2) <-- 파일명
dir = os.path.dirname(files2) <-- 전체경로
![](https://blog.kakaocdn.net/dn/cfQzgc/btrXqrGgWva/htH5fMP1iaaOM6HwmkqnQ0/img.png)
![](https://blog.kakaocdn.net/dn/nVgOh/btrXn9l16Ei/bJkXdvPxHZReD4Lw1Y5rY1/img.png)
라인 43~44 : 여러 파일을 선택 한 경우 해당 파일이름만 뽑아내기 위해서 for문을 이용하여 myfiles[] 리스트에 담아둡니다.
라인 54~55 : 그리고 실제 압축 시 다시 for문으로 myfiles에서 하나식 zip으로 쓰기(myzip.write) 합니다.
ㅁ 정리
O 우리가 배운 내용
dir = os.path.dirname(files2) # 전체경로
new_zip.write(file, compress_type=zipfile.ZIP_DEFLATED)
new_zip.close()
오늘은 여기까지이며, 댓글과 하트는 제가 이글을 지속할 수 있게 해주는 힘이 됩니다.
감사합니다.
※ 추가적인 정보는 아래 유튜브 영상에서 해당 내용을 더욱 자세히 보실 수 있습니다.
'파이썬 실습 > GUI 파일압축 및 해제 프로그램 만들기' 카테고리의 다른 글
파이썬 GUI 파일압축 및 해제 프로그램 만들기 - 3. 파일 압축 풀기 (0) | 2023.02.13 |
---|---|
파이썬 GUI 파일압축 및 해제 프로그램 만들기 - 1. 소개 (0) | 2023.02.13 |