데이터 카드를 패키지 형태로 압축 및 해제하는 기능을 제공하는 코드를 작성할 수 있습니다. 여기서는 zipfile 모듈을 사용하여 데이터를 .zip 파일로 압축하고, 필요 시 이를 해제하는 방식으로 구현합니다.


데이터카드 패키지 압축 및 해제 코드

import os
import json
import zipfile
from datetime import datetime


class DataCard:
    """데이터 카드 클래스"""
    def __init__(self, name, data, metadata=None):
        self.name = name
        self.data = data
        self.metadata = metadata or {
            "created_at": datetime.now().isoformat(),
            "description": "Default data card metadata."
        }

    def to_dict(self):
        """데이터카드를 딕셔너리로 변환"""
        return {
            "name": self.name,
            "data": self.data,
            "metadata": self.metadata,
        }

    @staticmethod
    def from_dict(data_dict):
        """딕셔너리로부터 데이터카드 생성"""
        return DataCard(
            name=data_dict["name"],
            data=data_dict["data"],
            metadata=data_dict["metadata"]
        )


class DataCardPackage:
    """데이터 카드 패키지 압축 및 해제 클래스"""
    @staticmethod
    def compress(data_cards, output_path):
        """데이터 카드를 ZIP 패키지로 압축"""
        with zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
            for index, card in enumerate(data_cards):
                card_name = f"card_{index + 1}.json"
                card_content = json.dumps(card.to_dict(), indent=4)
                zipf.writestr(card_name, card_content)
        print(f"Data cards compressed into: {output_path}")

    @staticmethod
    def decompress(zip_path, extract_path):
        """ZIP 패키지를 해제하여 데이터카드 목록 반환"""
        data_cards = []
        with zipfile.ZipFile(zip_path, 'r') as zipf:
            zipf.extractall(extract_path)
            for file_name in zipf.namelist():
                file_path = os.path.join(extract_path, file_name)
                with open(file_path, 'r') as file:
                    card_dict = json.load(file)
                    data_cards.append(DataCard.from_dict(card_dict))
        print(f"Data cards extracted to: {extract_path}")
        return data_cards


# 사용 예제
if __name__ == "__main__":
    # 데이터 카드 생성
    card1 = DataCard(name="Card1", data={"key1": "value1", "key2": "value2"})
    card2 = DataCard(name="Card2", data={"keyA": "valueA", "keyB": "valueB"})

    # 데이터 카드 압축
    cards = [card1, card2]
    output_zip = "data_cards.zip"
    DataCardPackage.compress(cards, output_zip)

    # 압축 해제
    extract_dir = "extracted_cards"
    os.makedirs(extract_dir, exist_ok=True)
    extracted_cards = DataCardPackage.decompress(output_zip, extract_dir)

    # 해제된 데이터카드 출력
    for card in extracted_cards:
        print(f"Name: {card.name}, Data: {card.data}, Metadata: {card.metadata}")

코드 설명

  1. DataCard 클래스:
    • 데이터를 표현하는 기본 데이터카드 객체.
    • 데이터카드를 딕셔너리로 변환하는 to_dict 메서드와, 딕셔너리로부터 데이터카드를 생성하는 from_dict 메서드 제공.
  2. DataCardPackage 클래스:
    • 데이터카드 압축(compress) 및 해제(decompress) 기능을 포함.
    • 압축 시 데이터카드를 JSON 파일 형태로 변환하여 .zip 파일로 저장.
    • 해제 시 .zip 파일에서 JSON 파일을 읽고, 이를 DataCard 객체로 변환.
  3. 사용 예제:
    • 두 개의 데이터카드를 생성하고 이를 data_cards.zip 파일로 압축.
    • 압축된 파일을 해제하여 원래의 데이터카드를 복원.

실행 결과 (예시):

압축 완료 메시지:

Data cards compressed into: data_cards.zip

해제 완료 메시지:

Data cards extracted to: extracted_cards

복원된 데이터카드 출력:

Name: Card1, Data: {'key1': 'value1', 'key2': 'value2'}, Metadata: {'created_at': '2025-01-07T12:00:00.123456', 'description': 'Default data card metadata.'}
Name: Card2, Data: {'keyA': 'valueA', 'keyB': 'valueB'}, Metadata: {'created_at': '2025-01-07T12:00:00.123456', 'description': 'Default data card metadata.'}

주요 기능

  • 데이터카드 압축:
    • 여러 데이터카드를 .zip 파일로 묶어 관리.
    • JSON 형식으로 저장하여 직관적인 데이터 구조 유지.
  • 데이터카드 해제:
    • .zip 파일에서 데이터를 복원하고, 데이터카드 객체로 재생성.
  • 유연한 메타데이터 관리:
    • 각 데이터카드는 생성 시간 등 메타데이터를 포함.

이 코드는 데이터카드를 저장하고 전송하거나, 대규모 데이터 관리에 활용할 수 있는 실용적인 방법을 제공합니다.

+ Recent posts