Story

사용 계기

AI허브에 있는 “야생동물 활동 영상 데이터”를 다루는데, 데이터량과 데이터 크기가 어마어마하다.
여기에 팀플이라 공유까지 해야하는 상황..
빠른 업로드와 압축 해제를 위해 구글 드라이브와 코랩을 사용했다.

속도 비교하기

데이터 : AI허브 야생동물 활동 영상 - 고라니 Train 원천데이터
데이터 개수 : 31,074개
데이터 포맷 : 이미지(png)


방법 총 소요시간
로컬에서 압축을 푼 후 구글드라이브 업로드 4시간 00분
압축파일을 구글드라이브에 업로드한 후 Zip Extractor로 압축 풀기 3시간 30분
압축파일을 구글드라이브에 업로드한 후 파이썬으로 압축 풀기 41분


(1) 로컬에서 압축 푼 후 구글드라이브 업로드

  • 로컬에서 압축 풀기 : 약 1시간
  • 구글드라이브 업로드 : 불명(도중 중단) 3시간 예상
  • 총 소요 시간 : 4시간


(2) 압축파일을 구글드라이브에 업로드한 후 Zip Extractor로 압축 풀기

  • 구글드라이브에 압축파일 업로드 : 약 30분
  • Zip Extractor 앱으로 압축 풀기 : 불명(도중 중단) 3시간 예상
  • 총 소요 시간 : 3시간 30분
  • (참고)이미지는 데이터 총량이 비슷한 다른 압축파일임


(3) 압축파일을 구글드라이브에 업로드한 후 파이썬 zipfile로 압축 풀기

  • 구글드라이브에 압축파일 업로드 : 약 30분
  • 파이썬으로 압축 풀기 : 약 11분
  • 총 소요 시간 : 41분
  • 코랩 무료 기준




방법 1 : zipfile

메서드 설명

메서드 설명 예시
zipfile.ZipFile() 압축 파일을 변수에 할당 test_zip = zipfile.ZipFile(‘압축파일 경로’, ‘모드’)
  모드 ‘w’ : 쓰기. 압축파일을 만들 때
‘r’(생략) : 읽기. 압축을 풀 때
‘x’ : exclusive create
‘a’ : append
zipfile.ZipFile().extractall() 모든 파일 압축 풀기 test_zip.extractall(‘압축을 풀 폴더’)
    폴더를 만드는 os.mkdir()메서드와 함께 사용하면 되겠다.
zipfile.ZipFile().extract() 압축 파일 내 특정 파일만 압축을 푼다. test_zip.extract(‘압축 풀 파일’, ‘압축 풀 폴더’)
zipfile.ZipFile.write() 특정 파일 압축하기 test_zip = zipfile.ZipFile(‘압축파일 경로’, ‘w’)
test_zip.write(‘압축 풀 경로’, compress_type=압축 유형)
  compress_type(압축 유형) zipfile.ZIP_DEFLATED : 일반적인 압축(기본값)
zipfile.BZIP2 : BZIP2 방법의 압축
zipfile.ZIP_LZMA : LZMA 방법의 압축


예시

압축 풀기

1
2
3
4
5
6
7
8
9
10
11
import zipfile

# 압축 풀기
zip_file_path = '/drive/content/TS01.고라니.zip' # 압축 파일
folder_path = '/drive/content/압축해제폴더'        # 압축 풀 폴더
test_zip = zipfile.ZipFile(zip_file_path)      # 압축 파일 선언

## 모든 파일 압축 풀기
test_zip.extractall(folder_path)
## 개별 파일 압축 풀기
test_zip.extract('1번파일.jpg', folder_path)

압축 하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import zipfile

# 특정 파일 압축 하기
file_path = '/drive/content/target/001.jpg'  # 압축할 파일 1개
folder_path = '/drive/content/target'        # 압축할 파일들이 있는 경로
zip_file_path = '/drive/content/target.zip'  # 압축파일 경로
test_zip = zipfile.ZipFile(zip_file_path, 'w')  # 압축파일 선언

## 압축하기
test_zip.write(zip_file_path, compress_type=zipfile.ZIP_DEFLATED)
test_zip.close()
## 폴더를 지정하면 폴더채로 압축 가능
test_zip.write(folder_path)  # compress_type 미선언시 ZIP_DEFLATED가 기본값
test_zip.close()

모든 파일 압축하기

1
2
3
4
5
6
7
8
9
10
11
12
13
import zipfile
import os

# 모든 파일 압축하기
test_zip = zipfile.ZipFile('만들 압축파일 경로', 'w')  # 압축 파일 선언
folder_path = '압축할 파일들이 있는 경로'

for folder, subfolders, files in os.walk(folder_path):
    for file in files:
        test_zip.write(os.path.join(folder, file),
            os.path.relpath(os.path.join(folder,file),
            '만들 압축파일이 들어갈 경로'), compress_type = zipfile.ZIP_DEFLATED)

특정 파일 압축하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import zipfile
import os

# 특정 파일 압축하기
# jpg가 확장자인 파일들만 압축하는 예시
test_zip = zipfile.ZipFile('만들 압축파일 경로', 'w')  # 압축 파일 선언
folder_path = '압축할 파일들이 있는 경로'

for folder, subfolders, files in os.walk(folder_path):
    for file in files:
        if file.endswith('.jpg'):
            test_zip.write(os.path.join(folder, file),
                os.path.relpath(os.path.join(folder,file),
                '만들 압축파일이 들어갈 경로'), compress_type = zipfile.ZIP_DEFLATED)




방법 2 : !unzip 명령어 사용

다음은 !unzip 명령어를 사용하는 방법이다.

예시

압축 풀 폴더를 지정해서 압축 풀기

1
2
3
4
5
6
7
!mkdir 압축  폴더 만들기
## 압축 풀 폴더 만들기

!unzip 압축파일경로및확장자.zip -d 압축풀폴더경로
## 지정 경로에 압축 풀기

현재 폴더에 압축 풀기

1
2
3
4
5
6
7
%cd 압축을  폴더
## 압축을 풀 폴더로 이동

!unzip -qq 압축폴더 경로  압축폴더.zip
## 압축 풀기



Reference

Zip Extractor - 네이버 블로그
https://code.tutsplus.com/ko/tutorials/compressing-and-extracting-files-in-python–cms-26816
https://yeko90.tistory.com/entry/파이썬-colab코랩에서-압축파일-풀기
https://velog.io/@nochesita/구글-코랩-Colab에서-압축-풀기