티스토리 뷰

반응형

0. jar 파일이란?

JAR(JAVA Archive) 파일은 자바 프로그램, 라이브러리, 리소스 및 관련 메타데이터를 포함하는 압축 파일 형식을 의미합니다. JAR 파일은 Java 클래스 파일과 관련된 모든 리소스를  자바 가상 머신(JVM)에서 실행할 수 있도록 하나로 압축한 형식입니다. 일반적으로 JAR 파일은 주로 자바 애플리케이션 개발 이나  라이브러리를 배포하는 데 사용됩니다. 

이번 포스트에서는 이러한 jar 파일을 파이썬에서 압축/해제 하는 방법에 대해서 알아보도록 하겠습니다 .

 

1. zipfile, jar파일인데 zipfile을?

JAVA와 같이  jar관련 된 모듈이 있지 않을까 생각했지만 존재하지 않았습니다. 대신 파이썬은  zipfile 모듈을 통해 jar 파일의 압축/해제를 할 수 있습니다. 사용법은 zip파일 압축하는 방식과 동일하게 jar 파일도 마찮가지 입니다. (혹시 다른 방법을 아시는 분들은 아래 댓글로 내용을 공유 부탁드립니다.)

 

2. jar  압축해제 

(1) 압축을 해제할 폴더를 선택하거나 만든다. (디렉토리 생성은 os.mkdir을 이용)
(2) zipfile.zipfile("JAR_PATH", "r")로 파일을 접근한다. (JAR_PATH는  파일의 위치를 생성합니다.)
(3) extractall(directoryPATH) 압축해제를 위한 경로 위치를 명시합니다.  

 

import zipfile

extract_directory = "압축을 해제할 디렉토리"
os.mkdir(extract_directory)

with zipfile.ZipFile(Dictionary_jar, 'r') as z :   
     z.extractall(extract_directory)

 

(조금더 생각해 보기) 폴더가 존재할 경우, os.mkdir(extract_directory)에서 애러가 발생합니다.  폴더가 존재할 경우를 검토하고 그에 맞는 처리를 한다면 더 좋은 코드가 될 것입니다. 

import os

if os.path.exists("폴더위치") :    
    print("폴더가 존재합니다")
else:
    print("폴더가 존재하지 않습니다")
만약 해당 폴더가 존재할 때 해당 폴더를 삭제하고 싶다면 아래의 코드를 참조하시면 더 좋습니다.
import os
import shutil
if os.path.exists("폴더위치") : 
    print("폴더가 존재합니다")
    shutil.rmtree(extract_directory)
else:
    print("폴더가 존재하지 않습니다")
만약 단순하게 특정  파일만 압축해제 한다면?
단순하게 파일 하나만 선택해서 압축을 해제하는 방법은 아래와 같습니다. 다만 차이점은 압축해제를 수행할  대상파일이 해당파일에 존재하는지  미리 알아야 하는 점입니다. 

압축파일에 대해 미리 압축파일이 존재하는지 알아보기 위해서는 namelist()모듈을 이용해서 해당 리스트를 확인 합니다. 
import os
import shutil

filepath = "파일위치"

#압축된 파일 검색하기 
with zipfile.ZipFile(filepath, "r") as Readzipfile :
    #압축된 파일을 해제합니다.
    print(Readzipfile.namelist())
    Readzipfile.extract('data1.txt', directoryPath)
namelist()의 조회 결과는 아래와 같습니다.

 

3. jar  압축하기

본 포스트에서는 압축해제 하는 방법을  먼저 알아보았습니다. 그 이유는 압축을 할 때는 폴더 단위(하위폴더 포함)에서 압축하는 것이 일반적이기 때문입니다. 단순히 파일을 압축하는 경우와 앞서 폴더단위에서 압축을 하는 것에 대해서 설명을 하도록 하겠습니다.  

파일 압축하기

아래와 같이 하나의 파일을 압축하는 방법은 매우 간단합니다. (본 예시에서는 with절을 기반으로 작성하였습니다. )
import zipfile

filepath = "파일이 존재하는 위치/압축파일명"
with zipfile.zipfile("filepath", "w") as zipfile :
    zipfile.write(zipfile)
파일 압축하기 - 폴더압축

그렇다면  폴더를 대상으로 파일을 압축할 경우는 어떻게 해야할까요? 

폴더 압축은 생각할 부분이 많습니다. 폴더 하위에 있는 모든 파일을 압축해야만 하기 때문입니다. 
 

여기서는 크게 두가지의 모듈을 추가적으로 사용합니다. 

os.path.relpath, os.walk
os.walk : 디렉토리를 지정하면  이를 기준으로 순회(리커시브)를 할 때  해당 모듈을 사용합니다 .
os.path.relpath:  상대경로를 지정할 때 사용이 됩니다. 

즉, 압축 대상되는 파일이 임시폴더 내에서 압축 대상폴더의 이름과 동일한 이름을 명명할 때 사용합니다. zipfile.wirte는 4개의 파라미터를 가지고 있으며, 이 중 두 번째 파라미터인 arcname가 압축할 때 이름을 가리킵니다.  그래서 아래의 코드를 보면, write에 두 두번째 파라미터에 os.path.relpath이 사용됨을 알 수 있습니다. 

 

import 

targetFolder_path = "압축할 대상경로 위치"
temp_dir = "임시저장폴더 위치"

with zipfile.ZipFile(filepath, 'w') as zip_ref:
    for root, _, files in os.walk(temp_dir): #os.walk를 통해 하위 디렉토리를 순회
        for file in files:
            file_path = os.path.join(root, file)
            zip_ref.write(file_path, os.path.relpath(file_path, temp_dir)) 
            #os.path.relpath를 통해 상대경로를 지정

아래 코드는 함수형으로 변환한 내용입니다. 

import os

def zip_directory(directory, zip_file):
    with zipfile.ZipFile(zip_file, 'w', zipfile.ZIP_DEFLATED) as zipf:
        for root, _, files in os.walk(directory):
            for file in files:
                file_path = os.path.join(root, file)
                relative_path = os.path.relpath(file_path, directory)
                zipf.write(file_path, relative_path)

zipfile.write의 파라미터 

zipfile는 4 종류의 파라미터를 가지고 있습니다. 각각의 파라미터는 아래와 같습니다 .

 

구    분
내    용
filename
ZIP 아카이브에 추가할 파일의 경로 및 이름입니다.
arcname
ZIP 아카이브에 추가할 파일의 아카이브 내부 경로와 이름입니다. 기본적으로 filename과 동일한 값이 사용됩니다.
compress_type
압축 유형을 지정합니다. 기본적으로 ZIP_STORED(0)로 설정됩니다.
compresslevel
압축 레벨을 지정합니다. 0(압축 없음)에서 9(최대 압축) 사이의 정수 값을 사용합니다. 기본값은 compress_type에 따라 달라집니다.

 

4. 맺음말

이번 포스트에서는  jar 파일을 압축해제하고 압축하는 방법에 대해서 알아보았습니다. 사용자 사전에 요긴하게 이용될 수 있을 것 같습니다. 관련 내용에 대해서는 향후 github를 통해서 공유하도록 하겠습니다. 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함