티스토리 뷰
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)
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를 통해서 공유하도록 하겠습니다.
'파이썬 기초' 카테고리의 다른 글
[파이썬(Python) 이야기 13화] Pandas(판단스) 데이터프레임(dataframe) 시작하기 (1) | 2023.06.26 |
---|---|
[파이썬(Python) 이야기 12화] SQLlite에 SQL쿼리 실행하기 (1) | 2023.06.18 |
[파이썬(python) 이야기 11화] 파이썬도 코드 작성 규칙, PEP STYLE GUID(PEP8), 코드 제대로(전문가처럼) 만들기 (2) | 2023.05.16 |
[파이썬(Python) 이야기 10화] 폴더 파일 정보 검색하는 방법(glob.glob) (1) | 2023.05.08 |
[파이썬(Python) 이야기 9화] SQLite 연결하고 데이터 프레임으로 읽기(Pandas) (1) | 2023.05.08 |
- Total
- Today
- Yesterday
- python 공부하기
- 엘라스틱
- 포스트그리
- pycharm
- excutemany
- pythostudy
- excel create
- glob.glob
- 파워쿼리
- 엑셀생성
- 검색엔진
- 패키지설치하기
- 엑셀
- PowerQuery
- fetchall
- 파이참
- pandas
- 폴더
- elastic
- SQLite
- Excel
- pip 의존성
- 버전다름
- 판단스
- PYTHON
- fetchmany
- 파이썬
- Reforme Code
- 판다스
- 프로세스통신
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |